일반 클래스 및 인터페이스의 비 일반 버전
-
05-07-2019 - |
문제
나는 종종 일반 인터페이스 나 클래스를 만들고이 클래스의 다른 버전을 사용하거나 일반적인 방식으로 사용하는 상황에서 나 자신을 발견합니다. 예를 들어 다음과 같은 인터페이스가있을 수 있습니다.
interface ICanCreate<T>
{
T NewObject();
}
클래스가 해당 유형의 공장이 될 수 있습니다. 그런 다음 일반 공장 수업에 등록하고 싶으므로 다음과 같은 글을 쓰려고합니다.
public class Factory
{
private Dictionary<Type, ICanCreate> mappings; // what do I put here????
public void RegisterCreator<T>(ICanCreate<T> creator)
{
}
public T Create<T>()
{
}
}
사전에서 내 값에 어떤 유형을 사용합니까? 나는 일종의 디자인 원칙을 놓치고 있는지 모르겠다. 나는 이것이 Co (NTRA?) 분산과 관련이 있다는 것을 알고있다. 모든 도움이나 아이디어는 대단히 감사 할 것입니다.
해결책
당신은 그냥 사용해야합니다 object
사전 선언에서 너 잘못된 종류의 물건을 넣지 않을 것임을 확인하거나 비 게 릭을 선언 할 수 있습니다. ICanCreate
인터페이스 ICanCreate<T>
확장.
기본적으로 C#에서 표현할 수없는 유형 관계를 원합니다. 그리고 그런 일이있을 때마다 약간 불쾌한 솔루션으로 끝나지만 여기에서 추악함을 격리 할 수있는 것처럼 보입니다 (즉, 단일 클래스 내에서 유지).
다른 팁
흥미롭게도 이것은 C# 4.0에서 해결 된 문제입니다.
public interface ICanCreate<out T> // covariant
{
T NewObject();
}
public class Factory
{
private Dictionary<Type, ICanCreate<object>> mappings = new Dictionary<Type, ICanCreate<object>>();
public void RegisterCreator<T>(ICanCreate<T> creator) where T:class
{
mappings[typeof(T)] = creator;
}
public T Create<T>()
{
ICanCreate<object> creator = mappings[typeof(T)];
return (T) creator.NewObject(); // I do not think you can get rid of this cast
}
}
제휴하지 않습니다 StackOverflow