【发布时间】:2011-08-03 03:04:28
【问题描述】:
参见 Main() 中的注释。为什么我不能执行以下操作?
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 generic List<T> 保留我的工厂策略。有没有办法让这个工作?
编辑
我添加了一个接受List<T> 并添加到SomeList<T> 的构造函数。这似乎不自然,但有效。这是一项昂贵的操作,尤其是在List<T> 很大的情况下。
我的问题标题不是最好的,我正在努力寻找一个展示更好方法的示例。
【问题讨论】:
-
除了
ToString(),我在List<T>中看不到任何虚方法,因此从它继承可能通常不是一个好主意。
标签: c# generics inheritance interface