[英]C# - how to create an inherited generic collection from a factory method
我正在嘗試編寫一個工廠方法,該方法將創建抽象泛型集合類的派生實例。 這是基類......
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必須具有無參數構造函數。 並且invokation調用拒絕相信ItemCollection
是從CollectionBase<ItemBase>
派生的。
有人可以指點我正確的方向嗎? 謝謝。
由於泛型不變性, ItemCollection
不是從CollectionBase<ItemBase>
派生的。 畢竟,您可以將ItemBase
添加到CollectionBase<ItemBase>
- 但您不希望ItemCollection
!
您需要在兩個類型參數中使方法通用:
static T CreateItemCollection<TCollection, TItem>()
where TCollection : CollectionBase<TItem>, new()
where TItem : ItemBase
{
return new TCollection();
}
只有集合類型需要無參數構造函數。 你這稱之為:
var collection = CreateItemCollection<ItemCollection, Item>();
這里的問題是泛型約束,在C#3.0中,有關於方差的任何余地。 相反,匹配相當嚴格。 由於ItemCollection派生自CollectionBase<Item>
因此它不被認為是從CollectionBase<ItemBase>
派生的,即使這些類型看似兼容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.