継承関係にあるクラスに、複数のディスポーザがある場合、ディスポーザは、 サブクラスのものから、スーパークラスへと、クラスの継承階層をたどりなが ら実行されます。クリエータの初期化コードの実行順序と逆になります。
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() によってインスタンスが生成されていますが、 どの変数に代入されていないので、生成されたインスタンスは全く無駄になり、 ガーベジコレクションが発生すると片付けられてしまいます。
この無駄なインスタンスが片付けられる際には、そのインスタンスに対して、 下記の順で、継承クラスのディスポーザが実行されます。
Cmm処理系は、あるインスタンスを廃棄するとき、そのインスタンスの生成元 クラスと、そのスーパークラスに定義されているディスポーザをすべて実行し なくてはなりません。継承関係にあるクラスの途中に、ディスポーザが定義さ れていないとしても、そこで処理をやめず、すべてのクラスを調べ、ディスポー ザをチェックする必要があります。