2009-09-08 8 views
2

추상 제네릭 컬렉션 클래스의 파생 인스턴스를 만드는 팩터 리 메서드를 작성하려고합니다. 여기에 기본 클래스 ...팩토리 메서드에서 상속 된 제네릭 컬렉션을 만드는 방법

abstract class ItemBase { } 

abstract class CollectionBase<T> : Collection<T> where T : ItemBase, new() { } 

... 그리고 자신의 파생 클래스 ...

class Item : ItemBase { } 

class ItemCollection : CollectionBase<Item> {} 

가 나는 ItemCollection를 생성하는 팩토리 메소드를 원하는 지금이다. 그러나 Item 클래스와 ItemCollection 파생 클래스는이 팩토리 메서드가 포함 된 클래스에서 알 수 없습니다. 이 ... 나는 그것이 있어야 상상하는 방법

static T CreateItemCollection<T>() where T : CollectionBase<ItemBase>, new() 
{ 
    return new T(); 
} 

... 그리고 나는

var collection = CreateItemCollection<ItemCollection>(); 

... 따라서 호출 상상하지만 ItemBase가 있어야하기 때문에 팩토리 메소드가 컴파일되지 않습니다 매개 변수없는 생성자. 그리고 부름 전화는 ItemCollectionCollectionBase<ItemBase>에서 파생되었다고 믿지 않습니다.

누군가 올바른 방향으로 나를 가리킬 수 있습니까? 감사.

답변

6

ItemCollection인해 일반 불변성에 CollectionBase<ItemBase>로부터 유도되지된다. 결국 을 CollectionBase<ItemBase>에 추가 할 수 있지만 귀하의 ItemCollection에 대해서는 원하지 않습니다.

는 두 가지 유형 매개 변수의 일반적인 방법을 확인해야합니다 :

static T CreateItemCollection<TCollection, TItem>() 
    where TCollection : CollectionBase<TItem>, new() 
    where TItem : ItemBase 
{ 
    return new TCollection(); 
} 

만 수집 유형은 매개 변수가없는 생성자를 필요로한다. , C# 3.0에서 일반 제약 여기

var collection = CreateItemCollection<ItemCollection, Item>(); 
+0

감사합니다. 컴파일러가 왜 그렇게 엄격한 주장을하는지 완전히 이해할 수 없더라도 (JaredPar에 의해 아래 주석을 달았습니다.) 이것은 내 문제를 해결합니다. –

+1

@Tim : 내가 말했듯이,'ItemCollection' *은'CollectionBase '와 같은 모든 호출을 허용해서는 안됩니다. 자세한 내용은 Eric Lippert의 블로그 시리즈에서 차이점을 읽어보십시오. 불행히도 지금 당장 실행해야하므로 링크를 추적 할 시간이 없어야합니다. –

3

문제 분산에 관해서 어떤 여유를 가지고 : 당신은 이것을 호출 할 것입니다. 매칭은 대신 상당히 엄격합니다. ItemCollection은 CollectionBase<Item>에서 파생되므로 유형이 인 경우이 표시 될 수 있지만 CollectionBase<ItemBase>에서 파생 된 것으로 간주되지 않습니다.

관련 문제