レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

BLOCKVROCKリファレンス目次はこちら

C#でGenerics

C#Genericsについての詳しい説明は以下のサイトを参照。(英語)
http://msdn2.microsoft.com/en-us/library/ms379564(VS.80).aspx

C#GenericsJavaと少し違っていますが、
基本的には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クラスを継承していることを保障できます。

フレームワークとか作りやすくなりますね!