【问题标题】:Can Override an observableCollection property in c#?可以覆盖 c# 中的 observableCollection 属性吗?
【发布时间】:2017-11-17 14:02:19
【问题描述】:

如何覆盖父级的 ObservableCollection 属性?

我有一个基类

abstract class Base
{
    public virtual ObservableCollection<AnotherBaseClass> items
    {
        get { throw new NotImplementedException(); }
    }
}

还有一个子类

class Derived : Base
{
     public override ObservableCollection<AnotherDerivedFromAnotherBaseClass> items
     {
         get { //some stuff }
     }
}

如果我这样做,编译器会说:项目必须是 ObservableCollectionAnotherBaseClass> 以匹配被覆盖的成员 Base.Items

我的 AnotherDerivedFromAnotherBaseClass 类继承自 AnotherBaseClass 那么为什么我不能这样做呢?

我怎样才能覆盖这个属性并在子项中保留好项目类型的约束?

【问题讨论】:

  • 你不能那样做。你可以让Base 通用。
  • 所以,目前我有一个绑定了我的基类的树视图,我需要为每个派生类检索我的项目。我该怎么做?
  • 你不能这样做。 ObservableCollection&lt;AnotherDerivedFromAnotherBaseClass&gt; 的实例不可分配给 ObservableCollection&lt;AnotherBaseClass&gt;。正如 Daniel 建议的那样,您需要将 Base 设为通用。

标签: c# oop observablecollection


【解决方案1】:

我的 AnotherDerivedFromAnotherBaseClass 类是从 AnotherBaseClass 继承的,为什么我不能这样做?

因为List&lt;Sheep&gt; 不是List&lt;Animal&gt;。如果你从他们那里读到,似乎是这样,但你忘记了他们一半的力量:插入。想象一下它

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&lt;Derived&gt; 只是不是ObservableCollection&lt;Base&gt;,您不能将其用作继承/覆盖的替代品。


那么可以做什么呢?

首先,保留基类签名有什么问题?它仍然有效。唯一的问题是可以插入 另一个 派生类。也许有一个IEnumerable&lt;Base&gt; 而不是一个真实的列表?

或者你可以有第二个属性,第一个复制它......不是很优雅,但它有效:

class Derived : Base
{
     public override ObservableCollection<ItemBase> items
     {
         get { return new ObservableCollection<ItemBase>(SpecificItems); }
     }

     public ObservableCollection<ItemDerived> SpecificItems
     {
         get { //some stuff }
     }
}

【讨论】:

  • 谢谢你的回答,我现在明白你的例子了。我将只删除基本属性,当我真正知道它是什么类型(或通过反射获得它)时,我将只使用子属性。
最近更新 更多