2009年2月19日木曜日

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

class Super { }
class Sub : Super { }
上記の様に、クラスに継承関係がある場合、以下のようなメソッド呼び出しを行ってもエラーとなりません。
#オブジェクト指向の基本です。
public static void Hoge(Super super) { }

public static void Main(string[] args)
{
Hoge(new Sub());
}
ただ、Genericが絡んでくるとうまくいかない場合があります。例えば、以下の例はコンパイルエラーとなります。
#Javaなら大丈夫らしいですが...
public static void Hoge(List<Super> list) { }

public static void Main(string[] args)
{
Hoge(new List<Sub>());
}
でも、List<Super>もList<Sub>も同じように処理したいことはあります。そんなときは↓の様に書くことになると思います。
public static void Hoge<T>(List<T> list) where T : Super { }
で、今日同じことをコンストラクタでやろうとしてつまづきました。↓って書けないんですね。
public Hoge<T>(List<T> list) where T : Super { }
仕方がないので、コンストラクタをprivateにして、CreateInstanceメソッドを使って初期化したんですが、一般的なやり方なのでしょうか?
public static Hoge CreateInstance<T>(List<T> list) where T : Super

0 件のコメント: