Datapayasadas

julio 17, 2010

Un poquito de Generics

Filed under: .Net, C#, Desarrollo, Generics, Software — Etiquetas: , — pabloide86 @ 1:12 pm

Hola mis queridos List<Amigos>

Hoy vamos a hablar un poco sobre el mundo de los Generics. Vamos derecho al código…

Supongamos que necesitamos un método que devuelve un objeto Persona:

public Persona GetPersonaByID(int idPersona)
{
     var persona = new Persona();
     // Aquí va el codigo para armar el objeto
     return persona;
}

Para llamar a este método lo hacemos de la forma:

Persona objeto = GetPersonaByID(5);

Hasta aquí ninguna novedad. Ahora bien, supongamos que queremos hacer que el mismo método trabaje con cualquier tipo de objetos:

//T: parámetro de tipo
public T GetEntityByID<T>(int idEntity)
{
    // Aquí va el código para armar el objeto. Veremos mas adelante qué necesitamos
    // para instanciar un objeto T
    // ahora se complica un poco mas porque no sabemos bien que tipo de objetos es T
    return entity;
}

Y ahora cuando llamamos a este método le vamos a indicar con qué tipo de objetos tiene que operar:

Persona p = GetEntityByID<Persona>(5);
Ticket t = GetEntityByID<Ticket>(8);
Auto a = GetEntityByID<Auto>(19);

Entonces, qué fue lo que paso!? Cuando le pasamos el parámetro de tipo al objeto le estamos indicando con qué tipo de objetos tiene que trabajar, y a ese parámetro de tipo lo podemos usar para instanciar clases, para indicar qué tipo de objeto devuelve el método, para pasarlo como parámetro a otras clases, etc…

En el ejemplo de arriba, el método GetEntityByID<Persona>(5); me devuelve un objeto Persona y no un object.

El mejor ejemplo que vimos de esto aplicado en la realidad es el List. Cuando nosotros hicimos:

List<Persona> lista = new List<Persona>();
lista.Add(persona1);

Lo que puede estar pasando en el framework debe ser algo como esto:

public class List<T>
{
     private System.Array list;  //Array interno que puede contener cualquier tipo de objetos

     //Constructor
     public List<T>()
     { 
     }

     public void Add(T objeto)
     {
           list.Add(objeto);
     }
}

Constraints

Ahora bien, puede ser que querramos restringir que tipos de objetos queremos que puedan usar esos métodos, sobre todo cuando vamos a llamar a determinados métodos y querémos estar seguros de que los métodos esten ahi!. Para ello tenemos los constraints que se aplican con la palabra where:

public T GetEntityByID<T>(int idObjeto) where T: EntidadBase, IOperaciones, new()
{

}

Con esto queremos decir que T tiene que heredar de EntidadBase, implementar la interface IOperaciones y tener un constructor sin parámetros. De lo contrario dará un error en tiempo de compilación.

Entonces ahora podemos estar seguros de realizar determinadas operaciones como por ejemplo:

public T GetEntityByID<T, D>(int idObjeto) where T: IOperaciones, where D: DataAccessLayer<T>, new()
{
    var objectDAL= new D<T>();  // D tiene el constraint de new()
    var object= Read(idObjeto);
    bool isEmpty = obj.IsEmpty();
    return object;
}

Ya la vamos complicando un poco mas 😛 lo que hicimos ahí fue pasarle dos parametros de tipo, T para indicar con qué tipo de entidades trabaja y D para indicarle con que tipo de DataAccessLayer.

Entonces para usar ese método tendremos que hacerlo de la siguiente manera:

Persona p = GetObjectByID<Persona, PersonaDAL>(7);

Como verán, las posibilidades son infinitas. Espero que les sirva!!

Saludos!!

Anuncios

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: