: Subsumption と 動的 dispatch
: クラスベース言語
: メソッド探索 (Method Lookup)
- サブクラスは(クラスと同様に)、
オブジェクト集合という構造を表現する。そのスーパークラスの拡張や、
変更を表現する。
- サブクラスでは、陰にスーパークラスのフィールドを複製し、新しいフィールド
を追加するかもしれない。
- サブクラスでは default で、スーパークラスのフィールドを複製し、
陽に、同じ(様な)名前と、タイプを持ったメソッドを override するかもしれない。
- サブクラス関係は、半順序である。
- 前の例を使ってサブクラス reCell を定義する。回復可能な
cell。
subclass reCell of cell is
var backup: Integer:=0;
override set(n: Integer) is
self. backup:= self. contents;
super. set(n);
end;
method restore() is
self. contents:= self. backup;
end;
end;
- クラス c' がクラス c から継承する時、 c' は
c のサブクラスという。
- フィールドがないクラスのサブクラスは、スーパークラスのメソッド
を全て override し、つまり「継承するするものがない」ことを示す。
- 逆に、サブクラス関係に依存しないで、メソッド共有のメカニズム
が存在する。そのため、我々は、継承とサブクラスを(注意深く)区別する。
- サブクラスがない場合 self は常に、そのクラスのオブジェクト
を指す。
- サブクラスがある場合、クラス c を継承したクラス c' の
中の self は、サブクラス c' のオブジェクトを指し、
クラス c のオブジェクトを指すものではない。
- super. m(a) により(特別な識別子 super)、
直接のスーパークラスのメソッドを呼び出す。その中で、
使われた self は、そのオブジェクト(スーパークラスの) を指す。
- メソッド探索を考える。method suites が各サブクラスに存在する。
動的に型づけされた言語では、サブクラスからスーパークラスへ、
該当するメソッドが見つかるまで探索される(図 2.3)。
- 静的に型づけされた言語(method suites の階層がコンパイル時に決定する)
では、suites がインタラクティブ検索が不必要なように、
各レベルで集められる(折りたためられる)(図 2.4)。
- 多重継承では、多数のスーパークラスをもつクラスを宣言できること以外、
特別な扱いはされない。(複数の)スーパークラスの attribute の間での重複と混乱
をどう扱うかについて決定しなければならない。
- もっとも簡単な解決方法は、同一の attribute の重複を同一視することである。
平成12年8月22日