Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以重写c#中的observableCollection属性?_C#_Oop_Observablecollection - Fatal编程技术网

是否可以重写c#中的observableCollection属性?

是否可以重写c#中的observableCollection属性?,c#,oop,observablecollection,C#,Oop,Observablecollection,如何重写父级的ObservableCollection属性 我有一个基础班 abstract class Base { public virtual ObservableCollection<AnotherBaseClass> items { get { throw new NotImplementedException(); } } } 抽象类基类 { 公共虚拟可观察集合项 { 获取{抛出新的NotImplementedException(

如何重写父级的ObservableCollection属性

我有一个基础班

abstract class Base
{
    public virtual ObservableCollection<AnotherBaseClass> items
    {
        get { throw new NotImplementedException(); }
    }
}
抽象类基类
{
公共虚拟可观察集合项
{
获取{抛出新的NotImplementedException();}
}
}
还有一个儿童班

class Derived : Base
{
     public override ObservableCollection<AnotherDerivedFromAnotherBaseClass> items
     {
         get { //some stuff }
     }
}
派生类:基
{
公共覆盖可观测集合项
{
获取{//一些东西}
}
}
如果我这样做,编译器会说:Items必须是ObservableCollection以匹配覆盖的成员Base

我的另一个派生自另一个基类的是继承自另一个基类的那么为什么我不能这样做呢

如何重写此属性并在子项中保留良好项类型的约束

我的另一个派生自另一个基类的另一个基类是从另一个基类继承的,那么为什么我不能这样做呢

因为
列表
不是
列表
。如果你从他们那里读到东西,你可能会觉得是这样,但你忘记了他们一半的力量:插入。想象一下,我们是谁:

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()); 
List sheep=new List();
//这不起作用,理由很充分:
列出动物=绵羊;
//哇。。。狼是一种动物,但它不应该
//可以像这样插入到绵羊列表中:
动物。插入(新狼());
因此,,您的
可观测集合
只是不是
可观测集合
,您不能将其用作继承/重写中的替换


那你能做什么呢

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

或者你可以拥有第二个属性,第一个复制它。。。不太优雅,但它可以工作:

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

     public ObservableCollection<ItemDerived> SpecificItems
     {
         get { //some stuff }
     }
}
派生类:基
{
公共覆盖可观测集合项
{
获取{返回新的ObservableCollection(SpecificItems);}
}
公共可观测收集特定项目
{
获取{//一些东西}
}
}
我的另一个派生自另一个基类的另一个基类是从另一个基类继承的,那么为什么我不能这样做呢

因为
列表
不是
列表
。如果你从他们那里读到东西,你可能会觉得是这样,但你忘记了他们一半的力量:插入。想象一下,我们是谁:

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()); 
List sheep=new List();
//这不起作用,理由很充分:
列出动物=绵羊;
//哇。。。狼是一种动物,但它不应该
//可以像这样插入到绵羊列表中:
动物。插入(新狼());
因此,,您的
可观测集合
只是不是
可观测集合
,您不能将其用作继承/重写中的替换


那你能做什么呢

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

或者你可以拥有第二个属性,第一个复制它。。。不太优雅,但它可以工作:

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

     public ObservableCollection<ItemDerived> SpecificItems
     {
         get { //some stuff }
     }
}
派生类:基
{
公共覆盖可观测集合项
{
获取{返回新的ObservableCollection(SpecificItems);}
}
公共可观测收集特定项目
{
获取{//一些东西}
}
}

你不能那样做。您可以将
Base
设置为泛型。因此,当前我有一个绑定了基类的树视图,我需要为每个派生类检索我的项。我怎么能这么做?你不能这么做。
observedcollection
的实例不能分配给
observedcollection
。正如Daniel所建议的,您需要将
Base
设置为通用。您不能这样做。您可以将
Base
设置为泛型。因此,当前我有一个绑定了基类的树视图,我需要为每个派生类检索我的项。我怎么能这么做?你不能这么做。
observedcollection
的实例不能分配给
observedcollection
。正如Daniel所建议的,您需要将
Base
设置为通用。感谢您的回答,我现在理解了您的示例。我只会删除基本属性,当我真正知道它的类型时,我只会使用子属性(或者通过反射获得它)。谢谢你的回答,我现在理解了你的例子。我将只删除基本属性,当我真正知道它的类型(或通过反射获得它)时,我将只使用子属性。