Generics

簡単に説明しろと言われてしまった。
というわけで、次のような説明をしてみた。


歩いて移動するメソッドがあります。

public void Walk();

走って移動するメソッドを追加しました。

public void Run();

全力疾走するメソッドを追加しました。

public void RunWithAllMight();

でも、実装はほとんど同じなのでちょっと考えてパラメータを付けて解決することにしました。*1

public void Move(int speed);

.NET の Generics (Parameterized Type) は、このようなパラメータ化をクラスに対して行うものです。
よって、実体化するための Type を作成するのは、次のようにパラメータとなるクラスを渡すというコードになります。

// Generics を利用したクラス
Type template = typeof(List`1);

// パラメータを渡した結果として生成された型を得る
Type intList = template.BindGenericParameters(typeof(int));

当然、C++ のテンプレートのような記述も可能です。

Type intList = typeof(List<int>);

List<int> numbers = new List<int>();

Move() メソッドは、int 型を引数に取りました。Generics でも引数となるクラスはどのようなクラスでも良いわけではなく、特定の条件に一致したクラスだけを受け入れることが出来ます。
まったく条件を指定しない場合、メソッドの引数が object 型である場合のように、すべての型を受け入れます。

Generics を利用したクラスも、.NET の自己完結性などの制約に従った形でなければなりませんので、親クラスをパラメータとして与えたり、引数に規定した制約にないメソッドを呼び出すようなことはできません。

うーん、40点ぐらいかね

*1:enum 使えよ、とかいうのはおいといて