パラメタ化クラス
テンプレート
型は決定していないが、その振る舞いが確定している場合がしばしばあります
例えば数学用のユティリティ分類子は、アルゴリズムが確定しています
しかし、演算対象はバイト型、整数型、浮動少数型でも良いことがあります
ほかにも、配列管理クラスなどが考えられます
配列を管理する手段や、入出力制御方法は統一されていまるため
全ての型において、配列管理用のクラスを作るのは冗長であると考えられます
可能であれば、型を抽象化し、振る舞いを定めておきたい場合があることでしょう
このような場合は、パラメタ化クラスを用いる方法があります
これは、俗に言うテンプレートで、C++ 言語ユーザーなどはおなじみでしょう
パラメタ化クラスは、小さな破線の矩形がクラスの右上隅に重ねられます
破線矩形には、仮パラメタ並びを記述します
仮パラメタは省略可能ですが、空であってはいけません
仮パラメタ化クラスは、この仮パラメタを属性や操作に使うことができます
これらは、実際にクラス化されるまで、値は決定されません
パラメタは、次のような構文を持ちます
識別子 : 型 = デフォルト値
デフォルトの値は省略可能であり、与えるかどうかは自由です
パラメタのスコープはパラメタ化クラスの内部でのみ有効とされます
さらに、パラメタは型を省略することも可能です
型を省略した識別子のパラメタ型はクラス(Classifier)であると認識されます
これはクラス化されるまで決定しないので、パラメタ化クラスは
抽象化されたクラス型を属性や操作で使用することができるのです
Array クラスは、配列を管理するためのパラメタ化クラスです
仮パラメタの T は型を省略しているため、これはクラスを表しています
max は int 型で、配列の大きさを表すための仮パラメタです
これらは、実際にクラス化されるまでその値は不明です
内部では、T 型の配列属性 ary が定義されています
また、T を設定する SetItem() と T を取得する GetItem() 操作があります
これらは、理論上型に依存する必要がないため、パラメタ化に適しています
束縛
パラメタ化クラスは、このままでは使うことができません
外部からは無意味な自由パラメタが存在するため、これを確定する必要があります
テンプレートのパラメタを実際に値に確定することを束縛と呼びます
パラメタ化クラスを束縛するには、関係を用いた明示的束縛と
関係は記述しない暗黙的束縛を使う方法があります
これらを総称して束縛済み要素と呼びます
明示的束縛は、破線を用いたインターフェイスの「実現」を結び
パラメタ化クラスをサプライア、束縛済み要素をクライアントとします
このとき、破線にステレオタイプ 《bind》を指定しなければなりません
と同時に、() を用いて操作を呼び出すように、仮パラメタにパラメタを与えます
暗黙的束縛は、次のような要素名の文字列として表示します
テンプレート名 <パラメタ>
束縛済み形式が元のテンプレートと異なる名前で表示したい場合は
前者の実現にステレオタイプを使って関係を表す方法を使い
そうでなければ、暗黙的束縛を用いて束縛します