Entradas EtiquetadasGenéricos
Delegados genéricos
Para poder entender correctamente los delegados genéricos debemos comprender antes algunos aspectos que explico a continuación.
Delegados:
Los delegados son una parte fundamental del Framework de .Net, pero… ¿Que es exactamente un delegado?, un delegado es un tipo que apunta a un método. Con la característica principal que dicho método ha de tener el mismo tipo de parámetros y valor devuelto.
| Nota: Los delegados son algo parecido a los punteros a funciones de C++, pero más potentes y seguros. |
Veamos un ejemplo:
C#
class Program
{
/*
Declaramos un delegado que apuntará a un metodo
que ha de retornar un tipo int y tener dos parametros de tipo int
*/
private delegate int CalculateHandler(int numA, int numB);
static void Main(string[] args)
{
//Creamos una instancia del delegado que apunte al metodo Calc
CalculateHandler calcDelegate = new CalculateHandler(Calc);
//Invocamos al delegado
Console.WriteLine(“Resultado de la invocación al delegado: “+calcDelegate(5,5).ToString());
//Otra forma de invocar al delegado
Console.WriteLine(“Resultado de la invocación al delegado con Invoke: “+calcDelegate.Invoke(5, 5).ToString());
Console.Read();
}
//Aquí hacemos la declaración del metodo para nuentro delegado.
private static int Calc(int numA, int numB)
{
return numA + numB;
}
}
VB
Module Module1
‘Declaramos un delegado que apuntará a un metodo que ha de retornar un tipo Integer y tener dos parametros de tipo Integer
Delegate Function CalculateHandler(ByVal numA As Integer, ByVal numB As Integer) As Integer
Sub Main()
‘Creamos una instancia del delegado que apunte al metodo Calc
Dim calcDelegate As New CalculateHandler(AddressOf Calc)
‘Invocamos al delegado
Console.WriteLine(“Resultado de la invocación al delegado: “ + calcDelegate(5, 5).ToString())
‘Otra forma de invocar al delegado
Console.WriteLine(“Resultado de la invocación al delegado con Invoke: “ + calcDelegate.Invoke(5, 5).ToString())
Console.Read()
End Sub
Private Function Calc(ByVal numA As Integer, ByVal numB As Integer)
Return numA + numB
End Function
End Module
En este sencillo ejemplo declaramos un delegado que apunta a una función y despues lo invocamos.
Tipos genéricos:
Desde la versión del Framework 2.0 se incluyen los tipos genéricos. Los tipos genéricos nos servirán para declarar código genérico, de forma que podremos preparar un elemento para recibir cualquier tipo.
| Nota: Antes de la implementación de los tipos genéricos se podía obtener un resultado parecido con el tipo object, que es el tipo base del cual descienden todos los tipos del .Net Framework. |
Veamos un ejemplo:
C#
class Program
{
//Lista genérica que contendrá elementos del tipo empleado
static List<Empleados> listaGenericaEmpleados;
static void Main(string[] args)
{
listaGenericaEmpleados = new List<Empleados>();
listaGenericaEmpleados.Add(new Empleados());
}
public class Empleados
{//Miembros de la clase empleados.
}
}
VB
Module Module1
‘Lista genérica que contendrá elementos del tipo empleado
Dim listaGenericaEmpleados As List(Of Empleados)
Sub Main()
Dim listaGenericaEmpleados As New List(Of Empleados)
listaGenericaEmpleados.Add(New Empleados())
End Sub
Class Empleados
‘Miembros de la clase empleados.
End Class
End Module
En este ejemplo declaramos una lista que contendrá elmentos del tipo empleados que ha sido definido por nosotros.
Delegados genénericos:
Al principio de este post, he descrito que un delegado ha de tener el mismo tipo de parámetros y valor devuelto que el método al que apuntará, pero… ¿Y si un delegado se pudiera declarar con parámetros del tipo genérico, y así poder dar flexibilidad a la función a la que apunte para poder implementar cualquier tipo de parámetros sin la necesidad de que sean del tipo object? Eso se consigue con los delegados genéricos.
C#
class Program
{
//Declaramos un delegado genérico
delegate string GenericDelegate<T,T2>(T valor1, T2 valor2);
static void Main(string[] args)
{
//Instanciamos el delegado genérico con tipos int y string
GenericDelegate<int, string> delegado1 = new GenericDelegate<int, string>(Valores);
Console.WriteLine(delegado1(1,“1″));
//Instanciamos el delegado genérico con tipos string y string
GenericDelegate<string, string> delegado2 = new GenericDelegate<string, string>(Valores);
Console.WriteLine(delegado2(“1″, “1″));
Console.Read();
}
public static string Valores(int val1, string val2)
{
return val1 + val2;
}
public static string Valores(string val1, string val2)
{
return val1 + val2;
}
}
VB
Module Module1
‘Declaramos el delegado genérico
Delegate Function GenericDelegate(Of T, T2)(ByVal val1 As T, ByVal val2 As T2) As String
Sub Main()
‘Instanciamos el delegado genérico con tipos int y string
Dim delegado1 As New GenericDelegate(Of Integer, String)(AddressOf Valores)
Console.WriteLine(delegado1(1, “1″))
‘Instanciamos el delegado genérico con tipos string y string
Dim delegado2 As New GenericDelegate(Of String, String)(AddressOf Valores)
Console.WriteLine(delegado2(“1″, “1″))
Console.Read()
End Sub
Private Function Valores(ByVal val1 As Integer, ByVal val2 As String)
Return val1 + val2
End Function
Private Function Valores(ByVal val1 As String, ByVal val2 As String)
Return val1 + val2
End Function
End Module
Como hemos podido ver, los delegados genericos nos ofrecen una flexibilidad importante a la hora de desarrollar de una forma más escalable.
1 comment Mayo 10, 2008