好的,情况就是这样。我有一个FlexCollection<T>
类,其目的是保存一些专业化的列表FlexItem
,因此:
public class FlexCollection<T> where T : FlexItem, new()
{
public void Add(T item) { ... }
...
}
FlexItem
不是泛型类本身。我想要实现的是能够在FlexItem
's 字段中保存对包含该对象的集合的引用。不幸的是,在 C# 中,不可能引用模板类的“任何”特化(如在 Java 中)。起初我尝试使用非泛型接口IFlexCollection
,但它实际上迫使我实现每个方法两次,即:
public class FlexCollection<T> : IFlexCollection where T : FlexItem, new()
{
public void Add(T item) { ... } // to use in generic calls
public void Add(object item) { ... } // to use for calls from within FlexItem
...
}
然后我发现我可以让 FlexItem 本身成为一个泛型类!然后一个特化可以持有对该特化的对象集合的引用(这是非常合乎逻辑的)。所以:
public class FlexItem<T> where T : FlexItem<T>, new()
{
public FlexCollection<T> ReferenceToParentCollection;
...
}
public class FlexCollection<T> where T : FlexItem<T>, new()
{
public void Add(T item) { ... }
...
}
现在我可以声明一些FlexItem<T>
专业化和相应的集合:
public class BasicItem : FlexItem<BasicItem> { public int A; }
public class BasicCollection : FlexCollection<BasicItem> { };
当我尝试扩展这些类以容纳其他字段时,就会出现问题。即我想要一个除了 field 之外还ExtendedItem
包含 field 的类:B
A
public class ExtendedItem : BasicItem { public int B; }
public class ExtendedCollection : FlexCollection<ExtendedItem> { };
问题是它ExtendedItem
是FlexItem<BasicItem>
and not的子类FlexItem<ExtendedItem>
。因此是不可能ExtendedCollection
像上面那样声明的。这会导致编译错误:
The type 'Demo.ExtendedItem' must be convertible to
'Demo.FlexItem<Demo.ExtendedItem>' in order to use it as parameter 'T'
in the generic type or method 'Demo.BasicCollection<T>'
有没有办法避免这种类型的冲突?