Main()のコメントを参照してください。なぜ私は以下を実行できませんか?SomeList <T>:リスト<T>としてリスト<T>をキャストできません。
public class SomeList<T> : List<T>
{
public SomeList(List<T> existing)
{
foreach (var item in existing)
Add(item);
}
public override string ToString()
{
return "I'm a better list.";
}
}
internal interface IReadStuff<T>
{
List<T> ReadStuff();
}
public class ReaderStrategy<Foo> : IReadStuff<Foo>
{
public List<Foo> ReadStuff()
{
return new List<Foo>();
}
}
public class Foo {}
public class Main
{
public Main()
{
var reader = new ReaderStrategy<Foo>();
// This works, but type is List<Foo>, not SomeList<Foo>
List<Foo> aList = reader.ReadStuff();
// This does not compile, but is what I want to do:
SomeList<Foo> aBetterList = reader.ReadStuff();
// This compiles, but always generates null for aBetterList:
SomeList<Foo> anotherBetterList = reader.ReadStuff() as SomeList<Foo>;
// This is funky but works:
SomeList<Foo> works = new SomeList<Foo>(reader.ReadStuff());
}
}
継承型でジェネリックを使用する方法を理解するのが難しいです。私はList<T>
の機能を拡張したいので、上記の必要性があります。例えば、SomeList<T> overrides ToString()
を参照してください。しかし、私は汎用のList<T>
を使って工場の戦略を維持したい。この仕事をする方法はありますか?
編集
私はList<T>
を受け入れ、SomeList<T>
に追加し、コンストラクタを追加しました。これは当然ではないようですが、うまくいきます。これは、特にList<T>
が大きい場合は高価な操作です。
私の質問タイトルは最高ではありませんでしたが、私が努力していたのはこれを行うためのよりよい方法を示す例でした。
()'、それは一般的に、おそらく良いアイデアではありませんから、私は継承し、一覧 ''内の任意の仮想メソッドが表示されません。 –
BrokenGlass