2009-08-19 3 views
2

私は特殊なコレクションクラスが必要です。それらをFooItemsとBarItemsと呼びましょう。特殊なコレクションを作成するときに継承または包含を優先しますか?

私は基本的にリストのすべての機能を必要としますが、新しいアイテムがコレクションに追加されたり削除されたりすると、余分な作業が必要になります。

私の最初のスタブは、単にリストとリストから派生してから、自分のAddメソッドとRemoveメソッドを作成することでした。これはもちろん、副作用を隠す関数を作成し、コンパイラは "new"キーワードを使って明示的に基底クラスを隠すことを提案します。

public class FooCollection : List<Foo> 
{ 
    public new void Add(Foo foo) 
    { 
     // Do my work then... 
     base.Add(foo); 
    } 
} 

これは嫌な感じです。これは、私の(非仮想の)Add関数を呼び出さず、リストバージョンであるため、誰かがListまたはIList参照を介してFooCollectionを参照すると問題を引き起こす可能性があります。

私の現在のコードでは、それは起こりそうもありませんが、未来を予測することはできません。

もちろん、IListインターフェイスを再実装してListを含めることもできますが、DRY違反の臭いがあります(特に複数のコレクションでは多くの作業があります)。

私はすでに好ましい方法として封じ込めに傾いています。他の誰かがこれに何らかの入力をしているのではないかと思っています。

答えて

4

この場合、組成を優先します。

IList<T>を実装する必要がありますが、いずれのパブリックAPIにもList<T>を直接継承を介して公開することはできません。それは実装の詳細でなければなりません。

3

私は匂いに同意し、封じ込めを推奨します。 IList<T>にすべての機能が必要な場合は、それを単純に保つ限り、おそらく運が上手くいかないでしょう。代わりにICollection<T>を使用できますか?

EDITEDこれを何度もやり直す必要がある場合は、仮想実装でいつでもMyList<T> : IList<T>を作成できます。少なくとも、インターフェイスの大部分を1回だけ実装しています。

関連する問題