문제

나는 종종 일반 인터페이스 나 클래스를 만들고이 클래스의 다른 버전을 사용하거나 일반적인 방식으로 사용하는 상황에서 나 자신을 발견합니다. 예를 들어 다음과 같은 인터페이스가있을 수 있습니다.

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
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top