可以覆盖c#中的observableCollection属性吗?

时间:2017-11-17 14:02:19

标签: c# oop observablecollection

如何覆盖父级的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 ,所以为什么我不能这样做?

如何覆盖此属性并在子项中保留好项目类型的约束?

1 个答案:

答案 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 }
     }
}