hay interfaces para algunas de las operaciones sobre los tipos de números, como las interfaces IComparable<T>
, IConvertible
y IEquatable<T>
. Puede especificar que para obtener una funcionalidad específica:
public class MaxFinder<T> where T : IComparable<T> {
public T FindMax(IEnumerable<T> items) {
T result = default(T);
bool first = true;
foreach (T item in items) {
if (first) {
result = item;
first = false;
} else {
if (item.CompareTo(result) > 0) {
result = item;
}
}
}
return result;
}
}
se puede utilizar delegados para expandir una clase con operaciones específicas de tipo:
public class Adder<T> {
public delegate T AddDelegate(T item1, T item2);
public T AddAll(IEnumerable<T> items, AddDelegate add) {
T result = default(T);
foreach (T item in items) {
result = add(result, item);
}
return result;
}
}
Uso:
Adder<int> adder = new Adder<int>();
int[] list = { 1, 2, 3 };
int sum = adder.AddAll(list, delegate(int x, int y) { return x + y; });
También puede guardar delegados en la clase, y tienen diferentes métodos de fábrica que configuran delegados para un tipo de datos específico. De esta forma, el código específico del tipo solo está en los métodos de fábrica.
No funcionan en este escenario, pero cuando trabajas con genéricos, es bueno tener en cuenta las "restricciones de tipo genérico". http://msdn.microsoft.com/en-us/library/d5x73970%28VS.80%29.aspx – STW
(respondió al comentario) –
Consulte esta publicación aquí http://stackoverflow.com/questions/32664/c- generic-constraint-for-only-integers – David