継承関係のあるクラス階層で、スーパークラスですでに定義されているクリエー タを利用するために、クリエータには、継承引数を設定することができます。
たとえば、下記のコード例のように、長方形をRectangleクラスで表現し、そのサブ クラスとして正方形Squareクラスを定義してみます。
ここで、Rectangleクラスのクリエータには、位置(x, y)と幅(w)と高さ(h)を 渡して、インスタンスを生成するようになっています。
class Rectangle {
private x, y ;
private w, h ;
method New(x, y, w, h) {
->x = x ; ->y = y ;
->w = w ; ->h = h ;
}
}
正方形については、長方形を継承したら、新たなメンバ変数を定義 する必要はありません。
また、正方形の場合は幅と高さが同じなので、Squareクラスのクリエータを考 えた場合、位置(x, y)と1辺の長さ(size)を渡せば、正方形を生成することが できます。そこで、Squareクラスのクリエータは、下記のようなコードが書け るならば、Reatangleクラスのクリエータを利用して実現することができます。
method Square::New(x, y, size) {
::Recangle->New (x, y, size, size) ;
}
しかし、クリエータの実行ルールからわかるように、 ::Recangle->New(...)では、新しいインスタンスが生成されてしまい、それが初 期化されますが、この値は、Square::Newが生成したインスタンスには繁栄さ れません。
この様な場合のために、Cmmでは、クリエータの継承引数を書くことができま す。これは、下記のようにメソッドの引数定義列に続いて、`:'を書き、スー パークラスのクリエータに引き渡す、引数の式を書きます。
class Square : Rectangle {
method New(x, y, size) : (x, y, size, size) { }
}
この継承引数は、引数名の定義ではなくて、式を書くことができます。例えば、 Rectangleクラスのサブクラスで、サイズが10の正方形SquareSize10クラスのクリ エータは、下記のように定義することができます。
class SquareSize10 : Rectangle {
method New(x, y) : (x, y, 10, 10) { }
}
クリエータの継承引数は、その直接のスーパークラスのクリエータに対しての み記述することができます。