2013-07-25 7 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

ジェネリッククラスから継承する代わりに(コンシューマは常にジェネリック型の引数を提供する必要はありません)、次のようにタイプエイリアスを使用することです: 'Using MyCollection = ObservableCollection ;'すべてのファイルでこれを指定してください)。 – Dai

答えて

9

大きな利点の1つは、Add関数を定義して、インライン初期化を容易にすることです。だから、例えば、この:

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

秒(関連)利益:あなたはXAMLで作業している場合は、サブクラス化されたコレクションを持つことは、あなたが(コレクションインスタンスを定義することができます

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

は、あなたがこれを書くことができます以下のようなマークアップとして/テストケース設計)、:

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

最後に、(これは単に好みの問題ですが、私はそれが一般的には悪くはない、と助けることができる)と仮定します。場合によっては、指定されたコレクションタイプに対してより多くのメソッド/プロパティが必要になることがあります。リファクタリングする必要なしに、型指定されたサブクラスを準備しておくとよいです。

+1

+1はXAMLの使用のために、私は、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

この例は、継承のための優れた使用法とはかけ離れており、特にそのクラスにほとんど何も追加しません。

通常、他のクラスと同じようにサブクラス化すると思いますが、それは便利な機能を提供しますが、何かもっと欲しいものです。たとえば、挿入、特殊な処理、追加インターフェイスの実装、または別の通知の実行、継承、必要に応じてメンバーの上書き/追加などの特定のアクションが必要な場合があります。

実施例は変更に関する通知に加えて、スレッドUIマーシャリングを行うObservableCollection<T>継承彼らは​​3210を有するWPF Caliburn.Micro、、、のためMVVMフレームワークで行われます。

関連する問題