加强前提条件和削弱后置条件如何违反Liskov替代原则?


19

我读到Liskov的替代原则在下列情况下被违反

  1. 前提条件得到加强,或者

  2. 后置条件被削弱

但是我还不完全了解这两点如何违反Liskov替代原则。可以请一个例子解释一下。具体地说,以上任何一种情况如何导致无法用子类对象代替超类对象的情况?

Answers:


29
  1. 假设您的基类与成员int一起工作。现在,您的子类型要求int为正。这是增强的前提条件,现在任何带有负整数的完美工作代码都将被破坏。

  2. 同样,假设情况相同,但是基类用来保证成员在被调用后将为正。然后,子类型更改行为以允许使用负整数。由于不支持后置条件,因此在对象上运行的代码(并假定后置条件是一个正整数)现在已损坏。

这些当然是简单的例子,但是这个概念成立了。诸如使文件/数据库连接保持打开状态之类的东西就是缓解后状态(导致问题)的一个示例。


1

在此处输入图片说明

不变-SelfDrivingVehicle的模板在所有子类型中均保持不变,即它执行覆盖行为以到达目的地的顺序。

让我们在这里假设另一种方法

           -List<SelfDrivingVehicle> vehicles 
           +Add(SelfDrivingVehicle vehicle)
            vehicles.add(vehicle)

前提条件-SelfDriveVehicle的“基本类型”中没有车辆(此处为“添加”),并且处于“弱化前提条件”中,该子类型无法通过更改属性车辆和显式加强其任何子类型来更改。任何子类型只能调用Add。

后置条件-调用“添加”后,“基本类型”处于“增强后置条件”中,该子类型不能通过更改车辆的值来减弱。

调用添加行为后,基本类型的状态将返回其原始状态。


-1

这个例子几乎被打死了,但考虑正方形/矩形或圆形/椭圆形的可能性。假设您有一个基类Rectangle,它定义了一个长度和宽度的对象。如果您的Square类继承了Rectangle类,则其setter / getter中将有一条规则,要求对长度或宽度的任何更改都将更改其对应项。这些尺寸要求加强了前提条件,因为用矩形代替正方形的矩形将缺少这些尺寸要求。假设您颠倒了继承关系,以使Rectangle继承Square,那么您将通过放宽尺寸要求以允许Rectangle独立运行来削弱后期条件。

但是,如果要删除尺寸更改功能,则替换原则成立,因为如果Rectangle和Square都不能更改尺寸,则它们具有相同的前后条件,而与继承无关。两者都具有长度,都具有宽度,并且都不能改变这些值。

参考:Wikipedia-http://en.wikipedia.org/wiki/Liskov_substitution_principle


1
不幸的是,该示例与形式验证无关。没有合同。
Frank Hileman '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.