多重継承

多重継承は、直近上位のクラスを複数持つときに起こります。その方法は、クラス定義の際の"super{ ... }"の中に、複数のクラス名を宣言することです。個数の制限については、特にドキュメントされていません。実際上は制限がないと考えてよいと思います。

多重継承には順位があります。先に宣言された上位クラスが優先、と考えることができます。例えば、
:CLASS   myClass  super{ SupClass1  SupClass2  SupClass3 }
......
のように宣言すれば、第一順位は"SupClass1"、次が"SupClass2"...というようになります。順位の意味は、上位クラスに同名のメソッドがあった場合の処理に関わります。具体的には、多重継承をしたクラスに属するオブジェクトに対して、メッセージを送った場合、優先順位にしたがってバインドされるべきメソッドが検索されるということです。このような処理によって、同名のメソッドを持つクラスを自由に多重継承することができるようにもなっています。

メソッド定義の中で、この優先順位を破って、劣後する上位クラスのメソッドをメッセージにバインドしたいときには、"SUPER> クラス名"という構文を使うことができます。例えば、
GET:  SUPER>  SupClass3
とすれば、SupClass1やSupClass2にも"GET:"というメソッドが定義されていたとしても、SupClass3の"GET:"メソッドがバインドされることになります。ただし、"SUPER>"は直近上位のスーパークラスしか指定できません。もっと上位のスーパークラス名を指定するとコンパイルエラーになります。

"class_as>"を用いたバインドの強制も可能です。"SUPER>"は多重継承したクラスのメソッド定義内でしか使えないので、外部からオブジェクトに送られるメッセージのバインドについて優先順位を破るには、この方法しかありません。

インスタンス変数も全て継承されます。実装としては優先順位にしたがって縦列されるとされています。多重継承された上位クラスに同じ名前のインスタンス変数が定義されていてもかまいませんが、直接メッセージを送るときには、優先順位が上位のものから継承されたインスタンス変数にメッセージが送られます。インスタンス変数を別様に指定する方法はないようです。上位クラスのインターフェイスメソッドを経由するのが筋なのでしょう。


関連項目:






最終更新:2018年12月23日 13:29