請參閱Main()中的註釋。爲什麼我不能執行以下操作?SomeList <T>:List <T> can not be cast as List <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()
。但是,我想使用.Net通用List<T>
來保持我的工廠策略。有沒有辦法做到這一點?
編輯
我補充說,接受List<T>
,並增加了SomeList<T>
構造。這似乎並不自然,但有效。這是一項昂貴的操作,特別是如果List<T>
很大。
我的問題標題不是最好的,我努力的是一個例子,顯示了一個更好的方法來做到這一點。
除了'的ToString()'我沒有看到名單''任何虛擬方法,因此繼承了它可能是通常不是一個好主意。 –
BrokenGlass