:
サブクラスとサブタイプの区別
:
アドバンスドなクラスベースの特徴
:
アドバンスドなクラスベースの特徴
オブジェクト型
(Simula などの)クラス元来の定式化においては、オブジェクトの タイプ定義は、 メソッドの実現の中で混ざり合っている。このような状態は、「実現」と 区別した「仕様」を 維持するという、現在ではよく知られた利点に混乱を来すものである。
比較的最近の研究では、この問題に注目している。オブジェクトの仕様と オブジェクトの実現を区別することは、 指定されたクラスとは独立に、オブジェクトのタイプを導入することにより 達成されうる。 このアプローチでは Modula-3 や
クラスとインターフェースの 両方
を導入している言語などで採用されている。
一般に、
InstanceTypeOf(cell)
の要素は
cell
で示された attribute の(タイプ)シグニチャが共通である。 これを、オブジェクトプロトコルという。
クラス
cell
とサブクラス
reCell
に対して、
class
cell
is
var
contents:Integer:=0
;
method
get():Integer
is
return self
.contents
end;
method
set(n:Integer)
is
self
.contents:=n
end;
end;
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;
に対して以下のように
ObjectType
を導入する。
ObjectType
Cell
is
var
contents: Integer
;
method
get(): Integer
;
method
set(n:Integer)
;
end;
ObjectType
ReCell
is
var
contents:Integer
;
var
backup:Integer
;
method
get():Integer
;
method
set(n:Integer)
;
method
restore()
;
end;
これらは、インターフェースとして表現されるに適しており、 1 通り以上で表現でき(クラスと)独立して実現される。
オブジェクトタイプ
Cell
のためのメタ表現として
ObjectTypeOf(cell)
を使う。オブジェクトタイプは、クラス
cell
から機械的に extract 可能である。そのため
o:ObjectTypeOf(cell)
または、
o:Cell
と書く。
我々が期待する主たる性質は、
new
が、全てのクラス
c
に対して定義できることである。異なったクラス
、
でも同じオブジェクトタイプ
Cell
を持つことが 有り得ることである(
と
が等しい場合)。
オブジェクトタイプ
Cell
を持つオブジェクトは、 attribute の実現とは関係なく、あるプロトコルをを満たすことが要求される。
平成12年8月22日