私はオブジェクト指向プログラミング言語のクラスのいくつかのスライドを読んでいて、タイプ-サブタイプの定義に足を踏み入れました:
Barbara Liskov、「データの抽象化と階層」、SIGPLAN Notices、23、5(1988年5月):
ここで必要なのは、次の置換プロパティのようなものです。タイプSのオブジェクトo_sごとに、タイプTのオブジェクトo_Tがあり
、Tに関して定義されたすべてのプログラムPに対して、o_Sが置換されてもPの動作は変わりません。 o_Tの場合、SはTのサブタイプです
次に、例を示します。
Point = {x:Integer、y:Integer}
PositivePoint = {x:Positive、y:Positive}
ここで、Positive = {k:Integer | k>0}PositivePoint≤Pointと言えますか?
はい。PositivePointタイプの要素は、Point用語で定義されたプログラムのPointタイプの要素を常に置き換える可能性があるためです。
さて...私にとっては、まったく逆のはずです。負の座標を持つPointを使用するプログラムではPositivePointを使用できなかったのに対し、Point≤PositivePointは逆にできたためです。
構文がまたはであるかどうかは疑問でしType ≤ Sub-type
たSub-Type ≤ Type
が、ステートメントはより明確に見えます。それでは、何が問題になっていますか?
編集
物事を簡単にするために、質問は次のとおりです。それPositivePoint
はのサブタイプであると言えPoint
ますか?なんで?
2回目の編集
私がコメントに書いたことをここに報告します。それが私の問題をより明確にすることを願っています。
プログラムが
Point
(-100、-100)からPoint
(100、100)までの正方形のマップを描画する必要があるとします。タイプを使用するとどうなりますPositivePoint
か?プログラムの動作は変わりませんか?そうではありません。この「変わらない振る舞い」は私が得られない唯一のものです。サブタイプの定義が単にinheriting and overriding
他のタイプからのものである場合、それは問題ありませんが、そうではないようです。