2011-08-03 4 views
0

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>이 큰 경우에는 값 비싼 작업입니다.

내 질문 제목이 최고가 아니었고, 내가 노력한 것은이 작업을 수행하는 더 좋은 방법을 보여주는 예였습니다.

+0

()'는 일반적으로 아마 좋은 생각이 아니다에서 내가 그렇게 상속 목록 ''에서 가상 방법을 볼 수 없습니다. – BrokenGlass

답변

3

reader.ReadStuff() 반환 List<Foo> -하지만 당신은 List<Foo>에서 상속 형 SomeList<Foo>의 객체에 할당하려고합니다. List<Foo>SomeList<Foo>이 아니기 때문에 작동하지 않습니다. 반대로 실행됩니다. 이 휴식하고 그 OOP 당신이 할 수없는 이유 - 다음 SomeList<Foo>에서만 사용할 수 있습니다이 개체에 기능에 액세스하려고 - ReadStuff()에서 List<Foo> 개체를 반환 할 법적 -

그것에 대해 생각 이것은 - 부모 클래스의 인스턴스가 예상되는 곳에 자식 클래스의 인스턴스를 사용할 수 있지만, 자식 클래스가 예상되는 부모 클래스는 사용할 수 없습니다.

질문 제목으로 돌아 가기 : SomeList<T> : List<T>List<T>으로 전송할 수 없습니까? 예, 가능하지만 List<T>SomeList<T> 번으로 캐스팅하려고합니다.

1

SomeList의 모든 인스턴스는 List의 인스턴스입니다. 그러나 List의 모든 인스턴스가 SomeList의 인스턴스는 아닙니다. 이것이 두 번째 임무입니다. reader.ReadStuff()는 SomeList가 아닌 List를 반환합니다. 희망이 도움이됩니다.

1

예에서 SomeList<Foo>의 인스턴스를 List<Foo> 번으로 캐스팅하지 않은 경우 List<Foo>SomeList<Foo> 번으로 캐스팅하려고합니다. 덜 구체적인 것에서 더 구체적으로가는 것인데, 효과가 없습니다. 그것은 다른 방향으로 작동해야합니다.

0

변화 ToString`게다가이 코드

SomeList<Foo> aBetterList = reader.ReadStuff() 

to 
SomeList<Foo> aBetterList = reader.ReadStuff() as SomeList<Foo>; 

before using 
    if(aBetterList !=null) {} 
+0

나는 이것을 시도했다. 항상 null로 리턴한다. – sapbucket