next up previous contents
Next: 12.6 クリエータの呼び出し手順 Up: 12. クラスの継承 Previous: 12.4 メソッドのクラス束縛

  
12.5 非束縛自己参照変数self

前節に記したように、自己参照thisは、クラスの束縛を受けます。その ため、サブクラスで、スーパークラスのメソッドを定義しなおして、サブクラ スの振る舞いを変更するというようなことができなくなります。

Cmmには、そのような動作をサポートするための自己参照変数が、self があります。メソッド内で、selfを用いてメンバを参照すると、そのメ ンバはクラスの束縛を受けなくなります。そのため、通常のメンバアクセスルー ルに従い、継承関係内に、同名のメンバがある場合は、最もクラスで定義され ているメンバが参照されます。



class A {
public message ;
method New () {
message = "Class A" ;
}
method ShowMe () {
println ("I am " + message) ;
}
method Print () {
self->ShowMe (); // [1]
}
}

class B : A {
public message ;
method New () {
message = "Class B" ;
}
method ShowMe () {
println ("I am " + message) ;
}
}

var b = B->New () ;
b->Print (); // [2]

上記のコード例で、[1]に示すselfは、クラス束縛を受けません。[2]の b->Print() 呼び出しが合った場合、Print()メソッド中のselfは、 クラスBのインスタンス(つまり、bそのもの)として振る舞います。

self->ShowMe()は、クラス束縛を受けず、通常のメンバアクセ スルールが摘要され、クラスBのShowMe()メソッドを参照することになります。


next up previous contents
Next: 12.6 クリエータの呼び出し手順 Up: 12. クラスの継承 Previous: 12.4 メソッドのクラス束縛
Tetsuo Ono
1998-11-05