템플릿 전문화를 시뮬레이션하는 패턴도 찾고있었습니다. 일부 상황에서 작동 할 수있는 몇 가지 접근 방식이 있습니다. 그러나 사건은 어떻습니까
static void Add<T>(T value1, T value2)
{
}
예를 들어 문을 사용하여 작업을 선택할 수 있습니다 if (typeof(T) == typeof(int))
. 그러나 단일 가상 함수 호출의 오버 헤드로 실제 템플릿 전문화를 시뮬레이션하는 더 좋은 방법이 있습니다.
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;
}
}
이제 유형을 미리 알지 않고도 작성할 수 있습니다.
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;
}
구현 된 유형뿐만 아니라 파생 된 유형에 대해 특수화를 호출해야하는 경우 In
인터페이스에 대한 매개 변수를 사용할 수 있습니다 . 그러나이 경우 메서드의 반환 유형은 T
더 이상 제네릭 유형이 될 수 없습니다 .