2013-01-31 4 views
2

필자는 추상 형식을 상속하는 구체적인 인스턴스를 반환하는 팩토리 클래스가 있습니다. 이 구체화 된 인스턴스에는 각 인스턴스마다 다른 데이터 유형이 필요하므로 해당 데이터 유형에 대한 일반 특성이 있습니다. Data 속성은 팩토리에서 설정되었으므로 추상 유형에도 있습니다.추상 클래스의 팩토리 메서드에서 제네릭 형식을 재정의 할 수 있습니까?

public static class FactoryClass 
{ 
    public static TType CreateNewClass<TType>(object data) 
     where TType : AbstractClass<object>, new() 
    { 
    var newClass = new TType {Data = data}; 
    // do some stuff 
    // keep track of all created types in a list 
    List.Add(newClass); 
    return newClass; 
    } 

    private List<AbstractClass<object>> MyList = new List<AbstractClass<object>>() 
} 

public abstract class AbstractClass<TData> 
{ 
    internal AbstractClass() 
    { 
    // do constructor things 
    } 

    protected SomeCommonFunction() 
    { 
    // common code for abstract base class 
    } 

    public abstract void DoSomethingToData(); 

    TData Data; 
} 

public class ExampleClass : AbstractClass<string[]> 
{ 
    public override void DoSomethingToData() 
    { 
    // sort the strings or something 
    // call the abstract code 
    } 
} 

나는 시도하고 그것이 내가 할 노력하고있어 할 수있는 더 나은 방법이 있나요 AbstractClass<object>

에 스트 할 필요가 나는 오류가 FactoryClass.CreateNewClass<ExampleClass>(myStringArray) 전화를?

where TType : AbstractClass<object> 

그 제약 조건이 정확히 컴파일러에 대해 불평하는 하나입니다

+1

. 오타가 많이 있니? – devio

+0

예. 나는 SO 문항에서 읽을 수있는 코드로 작업하는 코드를 닦아내는 것보다 쉬웠 기 때문에 처음부터 재 입력했다. 고쳤다. – WarrenB

답변

3

은 그럼이 문제입니다. 하지만 최소한이 유형의 측면에서 안전 - 불행하게도

public static TContainer CreateNewClass<TContainer, TData>(TData data) 
    where TContainer : AbstractClass<TData>, new() 

그 다음 방법에 모두 형식 인수를 지정해야합니다 : 당신이 정말로 이런 걸 원하는 것 나에게 소리

사용중인 데이터

FactoryClass.For(myStringArray).CreateNewClass<ExampleClass>(); 

For 방법의 유형 인수 제네릭 형식을 반환 : 당신은 당신이 뭔가를 쓸 수 있도록, 그들 사이에 사용되는 두 가지 일반적인 방법과 별도의 클래스를 만들어이 문제를 해결 할 수 있습니다 string[]CreateNewClass은 데이터 형식에 대해 컨테이너 형식을 사용하는 인스턴스 메서드입니다.

그러나 목록은 현재 양식으로는 작동하지 않습니다. 당신은 AbstractClass에 대한 제네릭이 아닌 기본 클래스를 만들 수 있습니다 :

public abstract class AbstractClass 
{ 
    // Anything which doesn't use TData 
} 
다음

: 그 시점에서

public abstract class AbstractClass<TData> : AbstractClass 

하여 공장의 목록이 List<AbstractClass> 될 것이다; 컴파일 타임에 안전한 방법으로 각 엔트리의 데이터 타입을 알지 못할 것이다 ... 각 요소가 다른 타입을 사용할 수 있기 때문에 완전한 의미를 갖는다.

(정적 방법에서 액세스하려는 경우 아, 그리고 물론 목록 필드 ... 정적해야합니다) 당신은 AbstractClass, AbstractBase 및 AbstractBaseClass를 참조

관련 문제