web-dev-qa-db-ja.com

List <T>から継承

List<T>を継承する新しいクラスを実装する最も速い方法は何ですか?

class Animal {}

class Animals : List<Animal> {} // (1)

私が遭遇した1つの問題:(1)を実行するだけで、List<T>からコンストラクターを継承するメリットが得られないことがわかりました。

最後に、AnimalsList<T>のように振る舞うようにしたい(たとえば、構築でき、Linqとの互換性がある)。しかし、さらに、独自のカスタムメソッドを追加できるようにもしたいと思います。

40
pistacchio

一般公開された動物コレクションを作成する場合は、List<T>から継承せず、代わりに Collection<T> から継承し、後置記号を使用する必要がありますクラス名のCollection。例:AnimalCollection : Collection<Animal>

これは フレームワーク設計ガイドライン 、より具体的にはサポートされています:

DO NOTパブリックAPIでArrayListList<T>Hashtable、またはDictionary<K,V>を使用します。代わりに、Collection<T>ReadOnlyCollection<T>KeyedCollection<K,T>、またはCollectionBaseサブタイプを使用してください。ジェネリックコレクションは、フレームワークバージョン2.0以降でのみサポートされていることに注意してください。

48
João Angelo

コンストラクターは、クラスとともに継承されません。目的のコンストラクタを再実装する必要があります。

public class AnimalsCollection : List<Animal>
{
     public AnimalsCollection(IEnumerable<Animal> animals) : base(animals) {} 
}
24
Anderson Imes

List<T>から派生することはお勧めしません。主に、リストは拡張用ではなく、パフォーマンス用であるためです。

独自の特定のコレクションを作成する場合は、Collection<T>から継承する必要があります。あなたの場合は次のようになります:

class Animals : Collection<Animal> {}
12
Euphoric

Listからの継承は必要な機能を備えていないため、多くのメンバーは仮想ではないため、基本実装をカバーする唯一の方法は、new構文( overrideとは対照的)。

標準リストアクションのカスタム動作の公開を開始する必要がある場合は、実際のストレージに内部リストを使用するだけのタイプですべてのリストインターフェイスを実装します。

これは最終的な要件に大きく依存します。

6
class Animals : List<Animal> {}

このように定義した直後に使用できるため、最良の方法と思われます。

私のアドバイスはあなたの質問のタイトルです:Inherit List<T> ;-)

4
Tokk

コレクションの初期化構文を使用したり、Linq拡張メソッドを使用したりするために、Listから継承する必要はありません。

IEnumerableメソッドとAddメソッドを実装するだけです。

4