2011-12-11 4 views
10

以下のクラスは、プライベートクラスフィールドの「ダウングレード」(より良い単語がないため)の奇妙な表現ですか?コレクションとリスト

public class AggregatedClass : ICollection<SingleClass> 
{ 
    List<SingleClass> _singleClassList; 

    // ...rest of code 
} 

私は最近、この「実用的な」例を見て、少しループしました。上記のポイントは何ですか? List<T>ICollection<T>を実装する場合、上記のクラスは逆転ではありませんか?あなたは、そのクラスの親クラスの実装(ICollection<T>)の拡張です型クラスのプライベートクラスフィールドを持っている。

上記の例が本当に素晴らしいデザインではないと言うのは正確ですか?

+0

さて、まだデータを保持するデータ構造が必要ですか? ICollection などのリストまたは配列になります。リストは、ICollection を実装するのがかなり簡単になります。 – hawkke

+0

@hawkke "リストは、IColleciton を実装するのをかなり簡単にします。"List "がICollectionを実際に実装しているというだけのことですか?? –

+0

それは冗長でしょうか?_singleClassListがpublicプロパティである可能性があるという議論をすることができます。 – hawkke

答えて

3

これは実装の詳細として抽象化されており、適切であれば、クラスはリストのさまざまなメソッドで追加のロジックを提供できるようになりました(Add/Removeなど、これらはList-of-T )。

フィールドがICollectionである必要がある場合は、それはクラスまでです!追加のList-of-Tメソッドを使用している可能性があります。または、クラスを作成した人にとっては便利な実装の詳細とは関係なく、プライベートなので害はありません。

+0

基本的には、 'ICollection 'を実装するクラスは 'List 'のメンバーを利用する必要があるかもしれませんが、 'AggregatedClass'のインスタンスは' List 'メンバーですか? –

+0

@Shark発信者は気にする必要はありません**宣伝された契約を満たしている限り内部で何を使用しているか... –

+0

これは基本的にセキュリティの形式です) 'List 'メンバーを公開せず、公開する'ICollection '(少なくとも)? –

3

それはほとんど近い将来に何をするか何AggregatedClassに依存します:プライベートフィールドを使用しているICollection を実装することにより、設計者はAggregatedClassは別のものから派生させるために自由であるままにしておきます。

C#は多重継承を許可していないため、貴重なものです。

私の意見では、クラスが "主に"の場合リスト私はそれを直接派生します。私が別のクラスから継承する必要がある場合、あなたの質問に表示された方法でクラスをリファクタリングすることは常に可能です。

6

私はそれに間違いはないと言います。 AggregatedClassは、ICollection<SingleClass>という契約を提供し、その契約がどのように実装されているのかを明確にすることはできません。例えばクラスが同様に定義されていた場合

public class AggregatedClass : List<SingleClass> 

その後、私ははい、それと設計上の問題があることを言わなければならないでしょう。 List<T>パブリックAPIに公開しないでください。のコレクションにはInsertItemClearItemsのような仮想メソッドがあり、リストクラスは後で基本クラスの動作をオーバーライドするための仮想メソッドを提供しないため、Collection<T>を公開することをおすすめします。

Collection<T>から特に継承したくない場合は、指定した例のようにICollection<T>を実装すると、クラスが他の基本クラスから継承することもできます。

関連する問題