前節に記したように、自己参照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()メソッドを参照することになります。