:
この文書について...
:
クラスベース言語
:
メソッド Specialization
Self Type Specialization
メソッド specialization は、サブクラスの定義において メソッドの返値のタイプを vary にする柔軟性を追加した。 もう一つの柔軟性は、メソッドの返値のタイプとして(再帰的に) そのクラスのタイプである時発生する。
クラス定義はしばしば、再帰的である。クラス
の定義では
が出現するかもしれない。例えば、以下の例を考える。
class
c
is
var
x:Integer:=0
;
method
m(): InstanceTypeOf(c)
is
... self ... end;
end;
subclass
c'
of
c
is
var
y:Integer:=0
;
end;
例えば クラス
のインスタンスを
とし、
のタイプが
となるか、そうでないとすれば、例えば
。一般に、
にある (継承された)メソッド
の返値として
とすることは、unsound である。 なぜなら、メソッド
は construct した
のインスタンス (
のインスタンスではない)を返すかもしれない。
以上より
Self
タイプの導入を考える。
Self
で
self
の タイプを考える。クラス
を以下のように書く。
class
c
is
var
x:Integer := 0
;
method
m()
:Self is ... self ... end;
end;
m
のコードの型づけは
Self
が
InstanceTypeOf(c)
の サブタイプでかつ、
self
が タイプ
Self
を持つという仮定に依存する。 健全性を成立させるために
m
の返答は
InstanceTypeOf(c)
では なくタイプ
Self
を持つに違いない。
が
のサブクラスとして宣言された時、
の返値のタイプはまだ、
Self
である。しかし
Self
は
InstanceTypeOf(c')
のサブクラス であるとみなす。このように
Self
は自動的に subclassing に対して specialize される。
伝統的なクラスベース言語において covariant ポジション(例えばメソッド の返値のタイプ)に
Self
を置くにおいての欠点はない。
フィールドのタイプとしても
Self
を使うことができる。
次の自然な拡張として、contravariant ポジションに置くことを考えること ができる。
Self
を contravariant ポジション(引数ポジション) に置くことは [55] での、簡単な counterexample にみられるように sound ではない。 継承されたメソッドでの引数ポジションにおけるタイプは specialized されないで generalized されるかもしれない。
contravariant ポジションに置く
Self
の正しい扱いは、 クラスベース言語においての新しい考察が必要である。3.4 と 3.5 で議論をする。
平成12年8月22日