next up previous contents
Next: 12.5 非束縛自己参照変数self Up: 12. クラスの継承 Previous: 12.3 クラス束縛演算子

12.4 メソッドのクラス束縛

クラス継承関係中にあるメソッドが呼び出された場合、そのメソッド内でアク セスできるメンバは、そのメソッドに属するクラスによって束縛されます。

例えば、下記のようなクラス定義では、



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

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

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

クラスBは、クラスAを継承し、また、クラスA、クラスB、どちらにも同じ名前 のメンバ、message と、メソッド ShowMe() があります。また、上記コードの コメントに示してある、[1]、[2]、[3]の行で、3つの方法で、メソッド ShowMe()を呼び出しています。

[4]で、クラスBのインスタンスを生成し、変数 b に代入し、さらに、[5]で Print()メソッドを呼び出しています。ここで呼び出される、Print()メソッド は、クラスAに属するメソッドが呼び出されます。ここで、Print()メソッドは、 クラスAの束縛を受けることになります。

メソッド呼び出し、b->Print() において、Print()メソッド中での thisは、このコード例の場合なら、変数 b を示すことになります。

ここで、b->ShowMe() というメソッド呼び出しを考えてみると、これは、第 12.2節に示したように、もっともサブクラスのメンバが アクセスされるというルールにより、クラスBのShowMe()メソッドが選択され ます。

ところが、[1]のメソッド呼び出しの場合、これは、クラスAのShowMe()メソッ ドが選択されます。これは、クラスAのPrint()メソッドが、クラスAの束縛を 受けているから、そのサブクラスのメンバの選択ができなくなっているからで す。[2]、[3]の呼び出しも同様に、クラスAの束縛を受け、クラスAのShowMe() メソッドが呼び出されます。

このように、メソッド内ではそのメソッドが属するクラスの束縛を受けるため に、そのメソッドが属するクラス、あるいは、そのスーパークラスのメンバは アクセスできますが、サブクラスのメンバのアクセスはできません。


next up previous contents
Next: 12.5 非束縛自己参照変数self Up: 12. クラスの継承 Previous: 12.3 クラス束縛演算子
Tetsuo Ono
1998-11-05