我正在阅读有关面向对象编程语言的课程的一些幻灯片,并进入了类型子类型定义:
Barbara Liskov,“Data Abstraction and Hierarchy”,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
or Sub-Type ≤ Type
,但语句似乎更清楚,那有什么问题?
编辑
只是为了让事情更容易,问题是:你能说那PositivePoint
是 的子类型Point
吗?为什么?
第二次编辑
我在这里报告我在评论中写的内容,希望它能让我的问题更清楚:
假设程序必须绘制一个从
Point
(-100, -100) 到Point
(100, 100) 的正方形地图。如果你使用 type 会发生什么PositivePoint
?程序的行为会不会改变?它不会。这种“不变的行为”是我唯一没有得到的。如果子类型的定义只是inheriting and overriding
来自其他类型,那没问题,但似乎并非如此。