Genéricos
Los tipos genéricos en C# son una herramienta poderosa que permite escribir código que puede trabajar con diferentes tipos de datos sin tener que escribir código específico para cada tipo. En lugar de especificar un tipo de datos específico, se utiliza un parámetro de tipo genérico que se reemplaza por un tipo de datos real en tiempo de compilación. Los tipos genéricos se definen utilizando la sintaxis <T>
, donde T
es el nombre del parámetro de tipo genérico. Aquí hay algunos ejemplos de cómo se utilizan los tipos genéricos en C#:
- Clases genéricas: Las clases genéricas son clases que se definen con uno o más parámetros de tipo genérico. Aquí hay un ejemplo:
public class Stack<T>
{
private List<T> items = new List<T>();
public void Push(T item)
{
items.Add(item);
}
public T Pop()
{
T item = items[items.Count - 1];
items.RemoveAt(items.Count - 1);
return item;
}
}
En este ejemplo, se define una clase genérica Stack
que utiliza un parámetro de tipo genérico T
. La clase Stack
utiliza una lista genérica para almacenar los elementos. Los métodos Push()
y Pop()
agregan y eliminan elementos de la lista.
- Métodos genéricos: Los métodos genéricos son métodos que se definen con uno o más parámetros de tipo genérico. Aquí hay un ejemplo:
public static T Max<T>(T a, T b) where T : IComparable<T>
{
if (a.CompareTo(b) > 0)
{
return a;
}
else
{
return b;
}
}
En este ejemplo, se define un método genérico Max
que utiliza un parámetro de tipo genérico T
. El método Max
compara dos valores de tipo T
y devuelve el valor máximo. La restricción where T : IComparable<T>
asegura que el tipo T
implementa la interfaz IComparable<T>
.
- Interfaces genéricas: Las interfaces genéricas son interfaces que se definen con uno o más parámetros de tipo genérico. Aquí hay un ejemplo:
public interface IStack<T>
{
void Push(T item);
T Pop();
}
public class Stack<T> : IStack<T>
{
private List<T> items = new List<T>();
public void Push(T item)
{
items.Add(item);
}
public T Pop()
{
T item = items[items.Count - 1];
items.RemoveAt(items.Count - 1);
return item;
}
}
En este ejemplo, se define una interfaz genérica IStack
que utiliza un parámetro de tipo genérico T
. La clase Stack
implementa la interfaz IStack
y proporciona implementaciones para los métodos Push()
y Pop()
.
Aquí hay un ejemplo de cómo crear una clase genérica que implementa métodos Max()
y Min()
que devuelven el mayor y el menor elemento, respectivamente:
public class GenericClass<T> where T : IComparable<T>
{
private T item1;
private T item2;
public GenericClass(T item1, T item2)
{
this.item1 = item1;
this.item2 = item2;
}
public T Max()
{
if (item1.CompareTo(item2) > 0)
{
return item1;
}
else
{
return item2;
}
}
public T Min()
{
if (item1.CompareTo(item2) < 0)
{
return item1;
}
else
{
return item2;
}
}
}
En este ejemplo, se define una clase genérica GenericClass
que utiliza un parámetro de tipo genérico T
. La clase GenericClass
utiliza dos campos privados item1
e item2
para almacenar los elementos. El constructor de la clase toma dos parámetros de tipo T
y los asigna a los campos privados. Los métodos Max()
y Min()
comparan los elementos y devuelven el mayor y el menor elemento, respectivamente.
GenericClass<int> gc1 = new GenericClass<int>(3, 5);
Console.WriteLine(gc1.Max()); // 5
Console.WriteLine(gc1.Min()); // 3
GenericClass<string> gc2 = new GenericClass<string>(“apple”, “banana”);
Console.WriteLine(gc2.Max()); // banana
Console.WriteLine(gc2.Min()); // apple