:
タイプパラメータ
:
アドバンスドなクラスベースの特徴
:
オブジェクト型
サブクラスとサブタイプの区別
サブタイプはサブクラス関係をもとにしていた。
構造的なサブタイピングの簡単な形を使う。二つのオブジェクトタイプ
と
で
(
は、
と同じコンポーネントを持つかまたは、それ以上の コンポーネントを持つ) コンポーネントとは、フィールドかまたはメソッドの 名前と、対応するタイプからなる。例えば
である。
この定義は、節 2.7 で議論したメソッド specilization を許すように拡張したが、コンポーネントタイプに対して オブジェクトタイプは invariant である。
オブジェクトタイプが再帰的に定義された時、サブタイプの定義に対して より注意深く扱わなければならない(9 章とそれ以降で議論する)。
このようなサブタイプの議論に対して、オブジェクトタイプは自然に、 多重サブタイプを提供する。以下のオブジェクトタイプ、
ObjectType
ReInteger
is
var
contents:Integer
;
var
backup:Integer
;
method
restore()
;
end;
に対して、
と
である。
結果として以下を得る。 (4)
が
のサブクラスである時、
である。この性質は、単にサブクラスが(親)クラスに新しい attribute を追加する ことができることを示し、overriding されたメソッドは、現存(その時の)タイプを 維持することを示す。
性質(4) は、節 2.4 で示した性質(3) を
用にしたものである。 subclassing-is-subtyping property である。
性質(3)では「必要十分条件」であったが、(4) の逆は成立しない。
で
かつ
としても、
が
のサブクラスとは限らない。
「サブクラスはサブタイプである」ので、前に説明した subsumption は同様に 使うことができる。
結果として、subclassing-is-subtyping の概念を弱めて、表現力を損なうこと なく subclassing-implies-subtyping にした。そして、インターフェースと 実現の区別を強めた。
平成12年8月22日