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()
참조). 그러나 .Net generic List<T>
을 사용하여 공장 전략을 유지하고 싶습니다. 이 일을 할 수있는 방법이 있습니까?
편집 나는 List<T>
를 받아 SomeList<T>
에 추가하는 생성자를 추가했다. 이것은 자연스럽지 않지만 작동합니다. 이는 특히 List<T>
이 큰 경우에는 값 비싼 작업입니다.
내 질문 제목이 최고가 아니었고, 내가 노력한 것은이 작업을 수행하는 더 좋은 방법을 보여주는 예였습니다.
()'는 일반적으로 아마 좋은 생각이 아니다에서 내가 그렇게 상속 목록''에서 가상 방법을 볼 수 없습니다. –
BrokenGlass