En el mundo de la programación un genérico nos permite escribir código que trabaja con cualquier tipo de datos sin perder la seguridad de tipos. Es una forma de crear clases, interfaces y métodos que pueden operar sobre varios tipos de datos sin duplicar código. Esto evita castings innecesarios y errores en tiempo de ejecución, ofreciendo reutilización y robustez.
Suponiendo que tenemos esta clase:
public class Caja<T> { private T contenido; public void Guardar(T elemento) { contenido = elemento; } public T Obtener() { return contenido; } }
Lo usaríamos de la siguiente forma:
Caja<int> cajaDeEnteros = new Caja<int>(); cajaDeEnteros.Guardar(42); Console.WriteLine(cajaDeEnteros.Obtener());
El tipo T se puede cambiar por cualquier clase o tipo primitivo, lo que lo vuelve extremadamente flexible. Si hacer ninuna conversión o casteo (cast). Veamos otro uso:
var myTypeFloat = new Caja<float>(); myTypeFloat.Guardar(232.0f); Console.WriteLine("Float: {}", myTypeFloat.Obtener()); var myTypeString = new Caja<string>(); myTypeString.Guardar("232"); Console.WriteLine("String: {}", myTypeString.Obtener());
Usar genéricos nos ahorra tener que hacer conversiones, casteos o incluso crear clases por tipos. ¿Se podrá usar con interfaces? La respuesta es sí.
public interface MyInterface<T> { T suma(T num1, T num2); }
Podríamos crear una clase que lo implemente, además específicamos el tipo a usar, en este caso será un BigInteger.
public class MyInterfaceImpl : MyInterface<BigInteger> { public BigInteger suma(BigInteger x, BigInteger y) { return x + y; } }
Creamos unas variables tipo ``BigInteger`` y se las pasamos al método de suma:
BigInteger x = new BigInteger(23); var y = new BigInteger(45); var myInterface = new MyInterfaceImpl(); var resultSuma = myInterface.suma(x, y); Console.WriteLine("Suma: {}", resultSuma);
Al final mostramos el resultado de la suma.
Este solo es un ejemplo del uso de clases e interfaces genéricas. Continuaremos con esta serie sobre C# en próximas entregas.
Enlaces:
https://emanuelpeg.blogspot.com/search/label/C%23Aprender a programar con C# (Libro)