Stavo anche cercando un modello per simulare la specializzazione del modello. Ci sono alcuni approcci che possono funzionare in alcune circostanze. Tuttavia per quanto riguarda il caso
static void Add<T>(T value1, T value2)
{
}
Sarebbe possibile scegliere l'azione utilizzando dichiarazioni es if (typeof(T) == typeof(int))
. Ma esiste un modo migliore per simulare la specializzazione del modello reale con l'overhead di una singola chiamata di funzione virtuale:
public interface IMath<T>
{
T Add(T value1, T value2);
}
public class Math<T> : IMath<T>
{
public static readonly IMath<T> P = Math.P as IMath<T> ?? new Math<T>();
T IMath<T>.Add(T value1, T value2)
{
throw new NotSupportedException();
}
}
class Math : IMath<int>, IMath<double>
{
public static Math P = new Math();
int IMath<int>.Add(int value1, int value2)
{
return value1 + value2;
}
double IMath<double>.Add(double value1, double value2)
{
return value1 + value2;
}
}
Ora possiamo scrivere, senza dover conoscere in anticipo il tipo:
static T Add<T>(T value1, T value2)
{
return Math<T>.P.Add(value1, value2);
}
private static void Main(string[] args)
{
var result1 = Add(1, 2);
var result2 = Add(1.5, 2.5);
return;
}
Se la specializzazione non dovrebbe essere chiamata solo per i tipi implementati, ma anche per i tipi derivati, si potrebbe utilizzare un In
parametro per l'interfaccia. Tuttavia, in questo caso i tipi di ritorno dei metodi non possono più essere di tipo generico T
.