2012-02-16 4 views

답변

1

난 당신이 컴파일 시간에 알 수없는 런타임에 클래스를 제공 할 수있는 것을 생각할 수있는 유일한 방법은 4 가지가 있습니다. 인터페이스를 구현하는 객체의 인스턴스를 제공받을 수 있으며, 인터페이스를 구현할 수 있습니다. 이 시나리오는 인터페이스가 NewSimilarInstance() 메소드를 포함하도록 처리하는 것이 가장 좋습니다. 클래스에 인터페이스에 제약이있는 제네릭 형식 매개 변수가 전달되는 메서드가있을 수 있습니다. 이 시나리오에서 일반 매개 변수를 허용하는 루틴은 new() 제약 조건을 가질 수 있습니다. 그렇지 않으면 .net System.Type 개체 또는 해당 형식에 대한 다른 표현 (해당 문자열)을 제공 할 수 있습니다. 후자의 두 시나리오에서 컴파일 타임 유효성 검사는 의미가 없습니다. 유형을 사용하여 작업을 수행하려면 Reflection이 필요하므로 Reflection을 사용하여 새 인스턴스를 만들 수 있는지 확인할 수 있습니다.

+0

첫 번째 시나리오와 두 가지 시나리오가 혼합 된 것입니다. 내 생각에'NewSimilarInstance()'에 대한 여러분의 제안이 훌륭한 것으로 생각됩니다. 감사! –

1

아니요, 그런 것은 없습니다. 인터페이스의 일반적인 사용은 인터페이스를 사용하는 코드가 어떻게 인스턴스화되었는지 신경 쓸 필요가 없다는 점을 감안하면 다소 이상 할 것입니다. 구현 클래스가 무엇인지 신경 쓰지 않아야합니다. 인터페이스 만 구현하면됩니다. .

특별한 용도로 사용하는 경우 단위 테스트를 작성하는 것이 좋습니다. 모든 구현이 동일한 어셈블리에 포함될 경우 매우 간단해야하고 오류는 에 잡힐 것입니다. 거의 컴파일 시간과 동일 ...

5

아니요 - 주어진 인터페이스의 파생 클래스 나 구현 자에게 이러한 제약 조건을 적용 할 수 없습니다.

이러한 제한은 일반적으로 일반적으로 인터페이스로 작업 할 때 일반적으로 해당 인터페이스를 구현하는 객체의 인스턴스를 사용하여 작업 할 때 객체가 자연스럽게 이미 만들어져있는 경우와 같이 유용하지 않습니다. 제약 조건은 중복됩니다. (물론 제네릭 인 경우는 예외이며,이 경우 new() 제약 조건을 사용할 수 있습니다).

내 생각 엔 일종의 플러그인 시스템을 만들려고 시도하고 플러그인 인터페이스의 구현을 제한하여 인스턴스 생성에 사용할 수있는 기본 생성자를 갖기를 원한다고 생각합니다. 그렇다면 정상적으로 존재합니다 MEF과 같은 더 나은 대안을 사용할 수 있습니다.

정확히 필요한 이유에 대해 자세히 설명해 주실 수 있습니까?

+0

인터페이스 유형 매개 변수 (IFoo라고 함)와 함께 제네릭 유형을 사용하고 싶습니다. 불행히도 매우 특별한 조건에서 IFoo 객체를 생성해야한다는 것을 발견했습니다. (나는 이것이 좋지 않다는 것을 안다.) 제네릭 형식에 new() 제약을 적용 할 수 있지만 IFoo에 new()가 없기 때문에 작동하지 않습니다 –

0

가상 클래스를 사용해야한다고 생각합니다.

+1

추상 클래스를 사용 했습니까? –

+0

그래, 나쁘다. 나는 최근에 많은 VB를 해왔고 그것은 저를 망치고 있습니다. – linkerro

0

저스틴은 인터페이스를 사용하여 생성자 시그니처를 제한 할 수 없으며 추상 클래스를 사용하여 생성자 시그너처를 제한 할 수 없다고 언급했듯이. 왜 그런 제약이 필요한지 설명하면 문제에 대한 다른 해결책을 찾을 수 있습니다.

0

인터페이스를 인스턴스화 할 수있는 일반 클래스에 팩토리를 주입하고 new() 제약 조건을 삭제하십시오. 같은

뭔가 :

public interface IFactory<out T> 
{ 
    T CreateInstance(); 
} 

public class GenericClass<T> 
{ 
    private readonly IFactory<T> _factory; 

    public GenericClass(IFactory<T> factory) 
    { 
      _factory = factory; 
    } 

    public DoSomething() 
    { 
      //... 
      T foo = _factory.CreateInstance(); 
      //... 
    } 
} 
관련 문제