Szukałem też wzoru do symulacji specjalizacji szablonów. Istnieje kilka podejść, które mogą działać w pewnych okolicznościach. Jednak co ze sprawą
static void Add<T>(T value1, T value2)
{
}
Możliwe byłoby wybranie akcji za pomocą instrukcji np if (typeof(T) == typeof(int))
. Ale jest lepszy sposób na symulację prawdziwej specjalizacji szablonów z narzutem pojedynczego wywołania funkcji wirtualnej:
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;
}
}
Teraz możemy pisać bez konieczności wcześniejszej znajomości typu:
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;
}
Gdyby specjalizacja była wywoływana nie tylko dla implementowanych typów, ale także typów pochodnych, można by użyć In
parametru dla interfejsu. Jednak w tym przypadku zwracane typy metod nie mogą być już typu ogólnego T
.