next up previous contents
Next: 13. 定義済みクラス Up: 12. クラスの継承 Previous: 12.7 クリエータの継承引数

12.8 ディスポーザの継承

継承関係にあるクラスに、複数のディスポーザがある場合、ディスポーザは、 サブクラスのものから、スーパークラスへと、クラスの継承階層をたどりなが ら実行されます。クリエータの初期化コードの実行順序と逆になります。


class Top {

private t ;
method New () { t = "top" ; }
method Dispose () { println ("disposing Top part"); }
}

class Middle : Top {
private m ;
method New () { m = "middle" ; }
method Dispose () { println ("disposing Middle part"); }
}

class Bottom : Middle {
private b ;
method New () { b = "bottom" ; }
method Dispose () { println ("disposing Bottom part"); }
}

var i ;
for (i = 0 ; i < 10000 ; i++)
Bottom->New () ;

ここでは、Bottom->New() によってインスタンスが生成されていますが、 どの変数に代入されていないので、生成されたインスタンスは全く無駄になり、 ガーベジコレクションが発生すると片付けられてしまいます。

この無駄なインスタンスが片付けられる際には、そのインスタンスに対して、 下記の順で、継承クラスのディスポーザが実行されます。

1.
BottomクラスのDispose()を実行
2.
MiddleクラスのDispose()を実行
3.
TopクラスのDispose()を実行

Cmm処理系は、あるインスタンスを廃棄するとき、そのインスタンスの生成元 クラスと、そのスーパークラスに定義されているディスポーザをすべて実行し なくてはなりません。継承関係にあるクラスの途中に、ディスポーザが定義さ れていないとしても、そこで処理をやめず、すべてのクラスを調べ、ディスポー ザをチェックする必要があります。


next up previous contents
Next: 13. 定義済みクラス Up: 12. クラスの継承 Previous: 12.7 クリエータの継承引数
Tetsuo Ono
1998-11-05