《Java设计模式及实践》—1.5.3 里氏替换原则

举报
华章计算机 发表于 2019/07/22 11:03:05 2019/07/22
【摘要】 本节书摘来自华章计算机《Java设计模式及实践》一书中的第1章,第1.5.3节,[印度] 卡马尔米特·辛格(Kamalmeet Singh)[荷兰] 艾德里安·伊恩库列斯库(Adrian Ianculescu) 著[罗马尼亚] 路西安-保罗·托尔耶(Lucian-Paul Torje) 张小坤 黄 凯 贺 涛 译.

1.5.3 里氏替换原则

Barbara Liskov指出,派生类型必须完全可替代其基类型。里氏替换原则(LSP)与子类型多态密切相关。基于面向对象语言中的子类型多态,派生对象可以用其父类型替换。例如,如果有一个Car对象,它可以在代码中用作Vehicle。

里氏替换原则声明,在设计模块和类时,必须确保派生类型从行为的角度来看是可替代的。当派生类型被其父类型替换时,其余代码就像它是子类型那样使用它。从这个角度来看,派生类型应该像其父类型那样表现,不应该破坏它的行为。这称为强行为子类型。

为了理解LSP,我们举一个违反原则的例子。在开发汽车服务软件时,我们发现需要对以下场景进行建模。当留下汽车需要服务时,车主离开汽车。服务助理拿走钥匙,当车主离开时,服务助理检查他是否有正确的钥匙以及是否发现了正确的车。他只是去解锁并锁上车,然后将钥匙放在指定的地方并留一张便条,这样机械师就可以在检查汽车时轻易找到钥匙。

我们已经定义了一个Car类,现在创建一个Key类并在汽车类中添加两个方法:lock和unlock。我们添加了一个相应的方法,助理检查钥匙是否匹配汽车:

 image.png

类图如图1-12所示。

在开发软件时,我们想到了有时通过汽车服务修理巴吉赛车(译者注:一种没有门的沙漠赛车,使用后轮驱动)。由于巴吉赛车是四轮车,我们创造了一个继承自Car的Buggy类。如图1-13所示。

    image.png

     图 1-12                         图 1-13

巴吉赛车没有门,因此无法锁定或解锁。我们相应地实现了代码:

 image.png

我们设计的软件要用于汽车,无论它们是否是巴吉赛车,所以将来可以将它扩展到其他类型的汽车。汽车能被锁定或解锁可能会产生一些问题。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。