2011-08-03 9 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()を参照してください。しかし、私は汎用の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のインスタンスであるとは限りません。それが2番目の割り当てがやっていることです。 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

関連する問題