2013-07-25 31 views
5

看過this MSDN article之後,我現在想知道將收集定義爲從ObservableCollection繼承的類是否有什麼好處。是否有此之間的任何差別顯著:繼承自ObservableCollection的集合 - 有哪些好處?

class MyCollection : ObservableCollection<MyObject> { } 

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

    public Class1() 
    { 
     _newCollection.Add(new MyObject()); 
    } 
} 

這:

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

    public Class1() 
    { 
     _newCollection.Add(new MyObject()); 
    } 
} 

有我俯瞰東西在這裏?

+1

我對你在問什麼有點困惑。如果您需要通過擴展來添加到ObservableCollection的額外功能,請編寫一個擴展它的類。如果你不這樣做,你可以使用ObservableCollection。 – TheEvilPenguin

+0

所以我猜在我看過的文章的情況下,爲了簡單起見,作者可能是這麼做的? –

+1

從泛型類繼承的一種替代方法(因此消費者不需要始終提供泛型類型參數)是使用類型別名,如下所示:'使用MyCollection = ObservableCollection ;'(缺點是您需要在所有文件中指定)。 – Dai

回答

9

一個主要的好處是您可以定義Add函數,這使內聯初始化更容易。因此,例如這樣的:

class MyCollection : ObservableCollection<MyObject> 
{ 
    public void Add(string prop1, string prop2) 
    { 
     base.Add(new MyObject { Prop1 = prop1, Prop2 = prop2 }); 
    } 
} 

使您可以這樣寫:

MyCollection collection = new MyCollection 
{ 
    { "prop1", "prop2" }, 
    { "prop1", "prop2" }, 
}; 

第二個(相關的)好處:如果你使用XAML工作,有子類的集合,您可以定義收集實例(設計/測試的情況下)爲標記,如:

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

最後,(這僅僅是口味的問題,我想)它不傷害一般,並且可以提供幫助。有時你最終需要給定集合類型的更多方法/屬性。準備好類型化的子類是很好的,不需要重構。

+1

對於XAML用法我使用了+1,它使用了一個從ObservableCollection 繼承而來的虛擬類,只是爲了在WPF中使用它。 但是,在XAML 2009中,原生使用泛型類是完全可能的,所以當您在WPF外部使用XAML時,此技術會失去價值。 – Alejandro

1

在你給出的例子中,沒有特別的好處。總的來說,我認爲如果你不以某種方式擴展或覆蓋繼承類,通常應該避免繼承,這是公平的。這就是說你的樣本不太忠於文章中的樣本。

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")); 
     } 
... 

在MSDN示例中,它們在類構造函數中添加了其他邏輯。在現實世界的例子中,這個類可能有一個構造函數,它具有某種類型的存儲庫接口,或者從文件中讀取,或者任何不屬於ObservableCollection功能部分的東西。因此,對原始問題的答案是另一個問題「你需要擴展ObservableCollection < T>?」

2

這個例子對繼承沒有什麼好用,那個特別的東西幾乎沒有增加類。

通常情況下,您可以按照與其他任何類相同的方式考慮對其進行子類化,當它提供有用的功能但您需要更多的功能時。例如,你可能想要一個特定的動作來進行插入,一些特殊的處理,實現一個額外的接口,或者一些不同的通知,然後你繼承,並根據需要重載/添加成員。

一個實際例子是在MVVM框架做了WPF Caliburn.Micro,他們有​​3210,從ObservableCollection<T>繼承,它除了通知關於改變執行線程UI編組。