C#のGenericsについての詳しい説明は以下のサイトを参照。(英語)
http://msdn2.microsoft.com/en-us/library/ms379564(VS.80).aspx
C#のGenericsはJavaと少し違っていますが、
基本的にはJavaと同じことはできるようです。
詳しくはまだ調べられていません。。
さて、型に対する型引数を指定する場合以下のようになります。
class Factory <T>{ }
型引数の制約
型引数の制約の設定をするには、以下のようにwhereキーワードを利用します。
こうすることで、型引数に渡すクラスをAのサブクラスに限定できます。
(C#ではextendsキーワードおよびimplementsキーワードの代わりに
コロン":"が使われるので、TはAを継承するという意味で読み取ることができますね)
class A {} class B extends A {} class Factory <T> where T : A { }
new() 制約
私が使えるなと思った機能はnew()制約です。
new()制約を使うことで、型引数からインスタンスを生成する機能があります。
(Javaでは型引数からインスタンスを作れなかったと思います。。調査中)
以下のように記述します。
class Factory <T> where T : new () {}
型引数に対する制約を組み合わせる場合は、以下のようにカンマで区切ります。
class Factory <T> where T : A,new () { }
Genericsの使いどころはFactory!!
個人的にGenericsは、特にFactoryを作るときなどに便利だと思っています。
そのためnew()制約は、ありがたい機能です。
これを使って以下のようにFactoryを作ることができます。
class A {} class B extends A {} class Factory <T> where T : A,new () { public static T createInstance(){ retrun new T(); } }
このFactoryを利用するには、以下のように記述します。
B bins = Factory<B>.createInstance();
これによって、FactoryクラスはBクラスについて知る必要はなく、
しかも、BクラスがAクラスを継承していることを保障できます。
フレームワークとか作りやすくなりますね!