我正在使用从抽象基类派生的通用集合类的层次结构来存储也从抽象基类派生的实体项:
abstract class ItemBase { }
class MyItem : ItemBase
{
public MyItem()
{
}
}
abstract class CollectionBase<T> : Collection<T> where T : ItemBase, new() { }
class MyCollection : CollectionBase<MyItem> { }
此模型的目标是对从 CollectionBase<T> 派生的任何类的成员强制执行严格的类型规则,并保证这些成员具有默认的公共构造函数。到目前为止它有效。
现在我想创建一个工厂方法,它返回从 CollectionBase<T> 派生的类的实例。我知道通常的方法是:
public CollectionBase<T> CreateCollection<T>();
... 或许 ...
public T Create CreateCollection<T>();
但是,问题是调用例程不知道需要什么“T”。工厂方法本身必须确定要返回的特定集合类型。所以我需要一个非泛型方法签名,上面写着“返回类型将派生自 CollectionBase<T>”。我设想这样的事情(如果它是合法的)......
public CollectionBase<> CreateCollection();
我认为这是另一个棘手的通用方差问题,但即使在阅读了 Eric Lippert 对该主题的广泛解释之后,我仍然不清楚我正在尝试做的事情在 C# 4.0 中是否可行,以及是否有一个简单的C# 3.0 中的解决方法。
提前感谢您的想法。