类型 - 子类型关系.有些东西似乎不清楚

And*_*mbu 6 oop liskov-substitution-principle

我正在阅读面向对象编程语言的类的一些幻灯片,并进入类型子类型定义:

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≤DealgePoint因为我无法在使用带负坐标的Point的程序中使用PositivePoint,而我可以反过来.

我怀疑,如果语法是Type ? Sub-typeSub-Type ? Type,但声明似乎更清楚,什么是错的呢?


编辑

只是为了让事情变得更容易,问题是:你能说这PositivePoint是一个子类型Point吗?为什么?


第二次编辑

我在这里报告我在评论中写的内容,希望它能让我的问题更加清晰:

假设程序必须绘制从Point(-100,-100)到Point(100,100 )的方形图.如果你使用类型会发生什么 PositivePoint?该计划的行为会保持不变吗?它不会.这种"不变的行为"是我唯一没有得到的.如果子类型的定义只是inheriting and overriding来自其他类型,那就没关系,但似乎并非如此.

Pet*_*der 3

Liskov是正确的,PositivePoint \xe2\x89\xa4 Point,因为PositivePoint是Point的细化。任何使用 Point 的代码也必须能够使用 PositivePoint,因为无论如何 Point 的坐标总是有可能为正值。反之则不然,因为使用 PositivePoint 的代码可能会在坐标始终为正的假设下运行,而用 Point 替换 PositivePoint 将打破该假设。

\n\n

请注意,她并不是说 PositivePoint 可以替代 Point,只是说 PositivePoint 可以用在需要 Point 的地方。

\n