2009年2月19日木曜日

メソッドスコープの型パラメータとコンストラクタ

  1. class Super { }  
  2. class Sub : Super { }  
上記の様に、クラスに継承関係がある場合、以下のようなメソッド呼び出しを行ってもエラーとなりません。
#オブジェクト指向の基本です。
  1. public static void Hoge(Super super) { }  
  2.   
  3. public static void Main(string[] args)  
  4. {  
  5. Hoge(new Sub());  
  6. }  
ただ、Genericが絡んでくるとうまくいかない場合があります。例えば、以下の例はコンパイルエラーとなります。
#Javaなら大丈夫らしいですが...
  1. public static void Hoge(List<Super> list) { }  
  2.   
  3. public static void Main(string[] args)  
  4. {  
  5. Hoge(new List<Sub>());  
  6. }  
でも、List<Super>もList<Sub>も同じように処理したいことはあります。そんなときは↓の様に書くことになると思います。
  1. public static void Hoge<T>(List<T> list) where T : Super { }  
で、今日同じことをコンストラクタでやろうとしてつまづきました。↓って書けないんですね。
  1. public Hoge<T>(List<T> list) where T : Super { }  
仕方がないので、コンストラクタをprivateにして、CreateInstanceメソッドを使って初期化したんですが、一般的なやり方なのでしょうか?
  1. public static Hoge CreateInstance<T>(List<T> list) where T : Super  

0 件のコメント: