簡體   English   中英

C# - 如何從工廠方法創建繼承的泛型集合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM