См. Комментарий в 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>
большой.
Название моего вопроса было не лучшим, к чему я стремился, это пример, показывающий лучший способ сделать это.