: Covariance、Contravariance と Invariance
: クラスベース言語
: Subsumption と 動的 dispatch
- subsumption は、実行時への影響がないが、オブジェクトの「真のタイプ」の
静的 knowledge を削減する結果となる。
- attirbute を持たない root クラス を想像しよう。全てのクラスが、
そのクラスのサブクラスとなる。そして subsumption により、全てのオブジェクトが
root クラスの member の一つとなり、attribute を持たない、使いものにならない
オブジェクトとみなされうる。
- InstanceTypeOf(reCell) から InstanceTypeOf(cell) へ
subsume する時に、フィールド backup へのアクセスはできなくなる。
- override されたメソッド set の中で self を通して
アクセスされる。
- subsumption により忘れ去られてたフィールドは、動的 dispatch により
使われうる。
- 動的 dispath が(また)唯一 subsumption により失われた attribute を
生かすメカニズムである。
- ほとんどの言語では、オブジェクトタイプを調べる方法を用意している。
結果として、失われた attribute に対するアクセスを増すことができる。
- 例えば、以下のように、タイプ InstanceTypeOf(cell) の
パラメータ を持った手続きが以下のコードを持つとする。
typecase x
when rc: InstanceTypeOf(reCell) do
... rc.restore() ...;
when c: InstanceTypeOf(cell) do
... c.set(3) ...;
end;
- アクセス不可能なフィールド restore にアクセスしている
2。
- typecase は有用であるが、技術的、理論的な理由で、不純(impure)
である。
- 第一に、private としてみなされているかもしれない情報を明らかにする。
- 第二に、適用すべき枝別れ(branch)がないなどの、動的 failure を誘発し、
プログラムをより不十分なものとする。
- 第三に(もっとも重要)、さらに cell をサブクラスを追加した場合、
既存コードの typecase 文を再修正しなければならない(less extensible)。
平成12年8月22日