4

これはおそらく私が物事を完全に逆に覚えているだけですが、私が間違っていることについてもっと知りたいです...

私はクラスをジェネリック リストからの直接継承にすぎないと宣言しました (名前付けを簡単にするために行いました)。次のようなものです。

public class FooList : List<Foo> {}

このクラスとは完全に別のメソッドで、このクラスのインスタンスを返そうとしていますが、基準に基づいてクラスをフィルタリングしたいので、ラムダ式を使用しています。

var list = new FooList(); // imagine this fills it with different items
var filtered = list.FindAll(c => c.Something == "filter criteria");

FindAll メソッドによれば、これは List[Foo] を返す必要があります。ただし、このオブジェクトを List[Foo] ではなく FooList として返したいと考えています。FooList の新しいインスタンスを作成し、List[Foo] からアイテムをコピーする必要がありますか?

もしそうなら、なぜですか?それらは同じオブジェクトであるため、リストを直接 FooList に変換できないのはなぜですか?

これができる場合、どうすればよいですか?

どうもありがとう!

4

3 に答える 3

8

あなたの問題は、仕事に間違ったツールを使用していることです。継承はネーミングを単純化するメカニズムではありません。継承は、主に (1) ビジネス ドメイン オブジェクトのクラス間の「一種の」関係をモデル化し、(2) 関連する型間で実装の詳細を共有および特殊化できるようにするために設計されたメカニズムです。

ネーミングを簡素化したい場合、ジョブに適したツールは次のとおりです。

using FooList = System.Collections.Generic.List<Foo>;

すべてのファイルの先頭にあります。

于 2010-09-15T21:49:15.477 に答える
6

それらは同じものではありません。AFooListはaですList<foo>が、から継承List<foo>された関数によって返されるaは、ではありません。新しいを作成する必要があります。FindAll()List<foo>FooListFooList

次のようなオブジェクトFooListを取得するコンストラクターを作成するようなことを行うことができます。IEnumerable<foo>

class FooList : List<foo>
{
   public FooList(IEnumerable<foo> l)
        : base(l)
   {  }
}

または、次のようなこともできます。

 var list = new FooList();
 var filtered = list.FindAll(c => c.Something == "filter criteria");
 var newList = new FooList();
 newList.AddRange(filtered);
 return newList;

ただし、他のいくつかの回答で述べたように、機能を追加しない場合は、usingキーワードを使用してエイリアスを作成する必要があります。

于 2010-09-15T21:41:24.703 に答える
1

新しいクラスを宣言しないでくださいFooList。エイリアスを使用するだけです。ソース ファイルの先頭に、次のように記述します。

using FooList = System.Collections.Generic.List<Foo>;

これで、どこにでも書き込むことができFooList、 とまったく同じものとして扱われますList<Foo>

于 2010-09-15T21:50:22.700 に答える