先日の自己言及するジェネリクス(Java版
/C#版)を書いていて
見えてきたことがあります。
ジェネリクスの具象型の与え方は2通りあり、そしてそれは、違う用途で用いられる、ということです。
コレクション型で用いられるジェネリクス
JavaやC#のジェネリクスで馴染みが深いのはコレクションAPIでのジェネリクスでしょう。
つまるところJavaのjava.util.Listや、
C#のSystem.Collections.Generic.List
といったクラスです。
これらのクラスは通常、newする際にジェネリクスの型パラメータに具象型を指定して具体化させます。
Java
List<String> stringList = new ArrayList<String>();
C#
List<String> stringList = new List<String>();
このタイプの使い方はよく用いられているようですが、もうひとつのジェネリクス型を具象化させる方法を使えていますか?
継承を用いた具象化
ジェネリクス型を具象化させるもうひとつの方法はクラスの継承の際に型を渡す手法です。
Java
public class StringList extends ArrayList<String> {
// ...
}
C#
public class StringList : List<String>
{
// ...
}
サンプルではListの継承としていますが、通常こちらの使い方はコレクションAPIに対しては使われません。
オブジェクト指向の継承の機能を利用して再利用可能な抽象化を行おうとする際に用います。
デザインパターンとの併用
この手法はデザインパターンと併用することでクラス設計に深みが生まれます。
相性の良いGoFデザインパターンには以下のものが挙げられると思います。
- ポリモフィズムで条件分岐するパターン(Strategy、State、Abstract Factory)
- 複雑な生成を隠ぺいするパターン(Builder、Factory Method)
- 構造に纏わるパターンの定石部分の再利用(Composite、Visitor)
ここに挙げたデザインパターン以外にも適用可能だとは思いますが、特徴的なのは上記のものだと考えています。
これらのデザインパターンでの具体的なジェネリクスの使い方は次回以降で詳しく掘り下げてみたいと思います。
投稿日時 : 2008年5月28日 23:32