《编程导论(Java)·2.1.1里氏替换原则》什么是LSP

你可以不知道继承、多态,但是必须知道里氏替换原则(Liskov SubstitutionPrinciple、LSP)。
摘要由CSDN通过智能技术生成

你可以不知道继承、多态,但是必须知道里氏替换原则(Liskov SubstitutionPrinciple、LSP)

1.要点

里氏替换原则/LSP是 OO 编程范式中规则范式的核心。
它说明(强调)了子类型必须具备替换属性,这在面向对象语言中如同常识。(类层次 Is_a 替代)
即在一个软件系统中,基类出现的所有地方都必须能够被子类型替代。
  • 子类型必须能够替代其父类型——《敏捷软件开发:原则、模式与实践Robert C. Martin
  • substitution property: If for each object s of type S  there is an object f of type F such that for all programs P defined in terms of F, the behavior of P is unchanged when f is substituted for s then S is a subtype of T..
    替换原则:对于类型S的任何一个对象s ,都存在一个类型F 的对象f ,在针对F编写的所有程序P中,如果用s替换f后,程序P的“行为”不变,则S是T的 子类型( subtype

LSP是正确设计类层次的指导原则,它检测和保证类层次的正确性,进而维护针对父类型编写的程序的正确性。(你针对父类型,进一步针对抽象类型编程,是OCP的管辖范围)

多态的本质,是不同子类替代父类变量后,可以对同一种消息,有不同的反应。

继承的本质,是子类承接了父类的接口。这是语言层面对LSP的支持。当然,程序员刻意用实现违背接口,没有人可以阻挡。




2.学习思路

因为易学,所以在《编程导论(Java)》中安排在2.1.1节。所以紧接其后,在[2.1.2 啊,我看到了多态]中才开始介绍向上造型、多态、改写(override);

所谓难精,我们

  • 继承加以分析,符合LSP的继承有实现继承、拓展继承、接口/协议继承和多继承;参考《4.2.3接口继承 Vs.实现继承》
  • 在介绍接口与实现分离时,强调什么是设计良好的接口,到[4.1.2类的接口]中,说明【p133:如果一个对象能够接受X类的接口的全部操作请求(方法调用),则称对象具有X类型。正是因为Java的子类能够满足父类的接口(尽管可以改写),所以子类的对象能够同时具有类层次中的多个类型】
  • 直到[8.3.2断言的使用指南]中介绍正方形和长方形关系时偷偷摸摸地说:继承关系即Is-A关系,本质上要通过接口的一致来衡量

实现继承是符合LSP的——即使对具体父类的方法的override有千般不好,它还是符合LSP的。你可以直接使用父类方法,或override空方法。你的方法 m()可以采用改进型override(总是调用super.m()一次)。你在遇到取代型改写时,问一问自己为什么?如果自己能够说服自己,那就用吧!谁敢咬你。

扩展继承是符合LSP的——即使向上造型导致扩展的方法(子类自己定义的方法)不能够用。白马非马,是好事。既保证了系统的扩展性——如果子类不能够定义自己的新方法,那样的语言你用?同时不影响LSP。比如说,Clien

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值