Kub*_*tek 15 c# generics inheritance wildcard
好的,所以情况就是这样.我有一个FlexCollection<T>课程,其目的是保留一些专业的清单FlexItem,因此:
public class FlexCollection<T> where T : FlexItem, new()
{
public void Add(T item) { ... }
...
}
Run Code Online (Sandbox Code Playgroud)
FlexItem不是泛型类本身.我想要实现的是能够在FlexItem字段中保存对包含该对象的集合的引用.不幸的是,在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
...
}
Run Code Online (Sandbox Code Playgroud)
然后我发现我可以让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) { ... }
...
}
Run Code Online (Sandbox Code Playgroud)
现在我可以声明一些FlexItem<T>专门化和相应的集合:
public class BasicItem : FlexItem<BasicItem> { public int A; }
public class BasicCollection : FlexCollection<BasicItem> { };
Run Code Online (Sandbox Code Playgroud)
当我尝试扩展这些类来保存其他字段时出现问题.即我想要一个除了字段之外还ExtendedItem包含字段的类:BA
public class ExtendedItem : BasicItem { public int B; }
public class ExtendedCollection : FlexCollection<ExtendedItem> { };
Run Code Online (Sandbox Code Playgroud)
事情是,它ExtendedItem是一个子类FlexItem<BasicItem>而不是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>'
Run Code Online (Sandbox Code Playgroud)
有没有办法避免这种类型的碰撞?
好的,我决定尝试一下 C# 事件。这样我实际上不需要 FlexItem 来保存对拥有 FlexCollection 的引用。如果执行相应的操作,我只需引发一个事件,即“IAmBeingRemoved”和 FlexCollection 的代码。那么代码逻辑就封装得更好了。我只是希望我不会遇到任何性能问题或其他基于通用的意外。:-) 我发布它是为了也许有人会发现它是解决他们自己问题的好方法。
| 归档时间: |
|
| 查看次数: |
1379 次 |
| 最近记录: |