C# 从ObservableCollection继承的集合-有什么好处?

C# 从ObservableCollection继承的集合-有什么好处?,c#,C#,在查看之后,我现在想知道将集合定义为继承自ObservableCollection的类有什么好处(如果有的话)。这两者之间是否存在显著差异: class MyCollection : ObservableCollection<MyObject> { } class Class1 { private MyCollection _newCollection = new MyCollection(); public Class1() { _new

在查看之后,我现在想知道将集合定义为继承自
ObservableCollection
的类有什么好处(如果有的话)。这两者之间是否存在显著差异:

class MyCollection : ObservableCollection<MyObject> { }

class Class1
{
    private MyCollection _newCollection = new MyCollection();

    public Class1()
    {
        _newCollection.Add(new MyObject());
    }
}
类MyCollection:ObservableCollection{}
一班
{
私有MyCollection _newCollection=newmyCollection();
公共类别1()
{
_添加(newmyObject());
}
}
这是:

class Class1
{
    private ObservableCollection<MyObject> _newCollection = new ObservableCollection<MyObject>();

    public Class1()
    {
        _newCollection.Add(new MyObject());
    }
}
Class1类
{
私有ObservableCollection _newCollection=新ObservableCollection();
公共类别1()
{
_添加(newmyObject());
}
}

这里有什么我忽略的吗?

一个主要优点是,您可以定义
Add
函数,这使得内联初始化更容易。例如:

class MyCollection : ObservableCollection<MyObject> 
{  
    public void Add(string prop1, string prop2)
    {
        base.Add(new MyObject { Prop1 = prop1, Prop2 = prop2 });
    }
}
第二个(相关)好处:如果您正在使用XAML,使用子类集合可以将集合实例(对于设计/测试用例)定义为标记,如中所示:

<local:MyCollection xmlns:local="MyNamespace">
    <local:MyObject Prop1="prop1" Prop2="prop2" />
    <local:MyObject Prop1="prop1" Prop2="prop2" />
</local>


最后,(我想这只是一个口味的问题)一般来说,它不会造成伤害,而且会有帮助。有时,对于给定的集合类型,您最终需要更多的方法/属性。有一个类型化的子类就好了,而不需要重构

在您给出的示例中,没有特别的好处。一般来说,我认为可以公平地说,如果您没有以某种方式扩展或重写继承的类,那么通常应该避免继承。尽管如此,你方样品与这篇文章中的样品并不完全一致

public class NameList : ObservableCollection<PersonName>
{
     public NameList() : base()
        {
            Add(new PersonName("Willa", "Cather"));
            Add(new PersonName("Isak", "Dinesen"));
            Add(new PersonName("Victor", "Hugo"));
            Add(new PersonName("Jules", "Verne"));
        }
...
公共类名称列表:ObservableCollection
{
公共名称列表():base()
{
添加(新人名(“威拉”、“凯瑟”);
添加(新人名(“伊萨克”、“迪内森”);
添加(新人名(“维克多”、“雨果”);
添加(新人名(“朱尔斯”、“凡尔纳”);
}
...

在MSDN示例中,他们在类构造函数中添加了额外的逻辑。在一个真实的示例中,这个类可能有一个构造函数,它接受了某种类型的存储库接口,或者从文件中读取,或者有任何数量的东西不属于ObservableCollection功能的一部分,因此您最初的问题的答案是另一个问题是“您是否需要扩展ObservableCollection?”

这个示例对于继承来说远远不是一个好的用法,它对类几乎没有任何添加

正常情况下,您可以考虑以任何其他类的方式来对它进行分类,当它提供有用的功能但您想要更多的东西时,您可能需要一个特定的动作来进行插入、一些特殊的处理、实现一个附加的接口或一些不同的通知,然后继承和覆盖。根据需要添加成员


一个实际的例子是在WPF的MVVM框架中完成的,其中有
BindableCollection
,继承自
ObservableCollection
,它除了通知更改之外还执行线程UI封送。

我对您的要求有点困惑。如果您需要可以添加到Observa的额外功能bleCollection通过扩展它,编写一个扩展它的类。如果你不这样做,你可以只使用ObservableCollection。所以我猜在我看的这篇文章中,作者可能是为了简单起见而这样做的?一种从泛型类继承的替代方法(因此使用者不需要一直提供泛型类型参数)是使用类型别名,如:
使用MyCollection=observeCollection;
(缺点是需要在所有文件中指定此项).Gotcha.感谢您的澄清。+1对于XAML的使用,我已经将其用于从
ObservaleCollection
继承的虚拟类,仅用于在WPF中使用它。但是,在XAML 2009中,完全可以在本机使用泛型类,因此当您在WPF之外使用XAML时,此技术失去了价值。
public class NameList : ObservableCollection<PersonName>
{
     public NameList() : base()
        {
            Add(new PersonName("Willa", "Cather"));
            Add(new PersonName("Isak", "Dinesen"));
            Add(new PersonName("Victor", "Hugo"));
            Add(new PersonName("Jules", "Verne"));
        }
...