next up previous contents
Next: 12.8 ディスポーザの継承 Up: 12. クラスの継承 Previous: 12.6 クリエータの呼び出し手順

12.7 クリエータの継承引数

継承関係のあるクラス階層で、スーパークラスですでに定義されているクリエー タを利用するために、クリエータには、継承引数を設定することができます。

たとえば、下記のコード例のように、長方形を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) { }
}

クリエータの継承引数は、その直接のスーパークラスのクリエータに対しての み記述することができます。


next up previous contents
Next: 12.8 ディスポーザの継承 Up: 12. クラスの継承 Previous: 12.6 クリエータの呼び出し手順
Tetsuo Ono
1998-11-05