:
Self Type Specialization
:
クラスベース言語
:
Covariance、Contravariance と Invariance
メソッド Specialization
サブクラスの議論では、 override するメソッドは、override されるメソッドと同じタイプを 持たなければならいことを前提とする。
これは、
method specialization
(引数と返値のタイプが異なってもよい) に緩めることが可能である。
フィールド(変数) のタイプの overriding と specialization は許していない。 フィールドは、
の時のように updatable である。よって各タイプは invariant である。
以下のプログラムを考える。
class
c
is
method
m(x:A): B
is ... end;
method
is ... end;
end;
subclass
c'
of
c
is
override
m(x:A'):B'
is ... end;
end;
許容できる
と
を考える。
InstanceTypeOf(c')
の
は、
InstanceTypeOf(c)
に subsume することができ、
を 呼び出すことができる。この時、
(covariantly) と
(contravariantly) である。この性質を override における メソッド specialization という。 返値のタイプ
は、
に specialized されたといい、 引数のタイプ
は、
に generalized されたという。
は、
に specialized されたという。
継承により陰に発生するメソッド specialization がある。
のメソッドにある
self
は
InstanceTypeOf(c)
である。
self
に束縛されている 全てのオブジェクトは、
InstanceTypeOf(c)
かまたは
InstanceTypeOf(c)
のサブタイプになる。このように、
self
は継承の時に、陰に specialized される(covariantly!)。
最初の引数が
self
である(関数とみなすことができる)メソッド (
pre-method
という)を考えたときの specialization を考える。
のメソッド
を
とし、 タイプ
とする。このタイプは
のサブタイプ であり、
は subsumption によりこのタイプも持つ。よって
は
の「正しい」
pre-method
のタイプを持つことになる。 よって、
は
により継承されうる。
一般に タイプ
の継承可能なタイプは、subsumption により
でもある(
かつ
)
3
継承により生ずる、引数と返値の包含関係は、overriding のためのそれとは 逆方向である。継承の場合は、引数のタイプは specialized され、返値のタイプは generalized される。override の場合は、引数のタイプは generalized され、 返値のタイプは specialized される。
平成12年8月22日