如何覆盖父级的ObservableCollection属性?
我有一个基类
abstract class Base
{
public virtual ObservableCollection<AnotherBaseClass> items
{
get { throw new NotImplementedException(); }
}
}
和一个儿童班
class Derived : Base
{
public override ObservableCollection<AnotherDerivedFromAnotherBaseClass> items
{
get { //some stuff }
}
}
如果我这样做,编译器会说:Items必须是ObservableCollection&lt; AnotherBaseClass &gt;匹配覆盖成员基础 .Items
我的 AnotherDerivedFromAnotherBaseClass 类来自 AnotherBaseClass ,所以为什么我不能这样做?
如何覆盖此属性并在子项中保留好项目类型的约束?
答案 0 :(得分:0)
My AnotherDerivedFromAnotherBaseClass类继承自AnotherBaseClass,为什么我不能这样做?
因为List<Sheep>
不是List<Animal>
。如果你从他们那里读取它可能看起来如此,但你忘记了他们的一半力量:插入。试想一下 :
List<Sheep> sheep = new List<Sheep>();
// this does not work and for a good reason:
List<Animal> animals = sheep;
// whoopsie... a wolf is an animal, but it should never
// be able to be inserted into a list of sheep like this:
animals.Insert(new Wolf());
所以没有,您的ObservableCollection<Derived>
只是不是一个ObservableCollection<Base>
,您不能将其用作继承/覆盖的替代品。
那么可以你做什么?
那么,首先,保持基类签名有什么问题?它仍然有效。唯一的问题是可以插入另一个派生类。也许有IEnumerable<Base>
而不是真正的清单?
或者你可以拥有第二个属性,第一个属性制作副本...不完全优雅,但它有效:
class Derived : Base
{
public override ObservableCollection<ItemBase> items
{
get { return new ObservableCollection<ItemBase>(SpecificItems); }
}
public ObservableCollection<ItemDerived> SpecificItems
{
get { //some stuff }
}
}