1. 定义

子类型必须能够替换掉他们的父类型。

2. 解读

子类可以扩展父类的功能,但不能改变父类原有的功能。也即:

a) 子类可以实现父类的抽象方法,但不能覆盖/重写父类的的非抽象方法

b) 子类可以增加自己的特有方法

遵循上述原则的原因在于,继承是有入侵性的,所有的子类都会拥有父类的(非private)属性的方法。这使得父类与子类之间存在着“强耦合”,父类属性和方法的变化,会直接影响子类。

保证父类的方法不被“覆盖/重写”,保证了继承链上行为的一致性,也使得父类的代码是真正的的被“复用”,而子类可以在父类的基础上新增行为。

多态的实现,是通过子类对于“抽象方法”的重写,以及子类新增的方法实现。

遵循“里氏替换原则”,也是实现“开放-封闭原则”的前提。正是由于子类的可替换性,才使得使用父类型的模块在无需修改的情况下,就可以扩展。不然,何谈对“扩展时开放的,对修改是封闭的”呢。

同时,“里氏替换原则”也同时反映了“依赖倒转原则”的思想,程序的依赖关系应该终止于抽象,这个抽象可以是抽象方法,抽象类,接口。重写父类的非抽象方法,就破坏了对“抽象的依赖性”,让程序设计有依赖于实现细节,违背的面向对象设计的初衷。

3. 类图

4. 举例

在设计继承关系时,应该时刻考虑“里氏替换原则”,如果子类无法替换掉父类,那么这个子类与父类之间的继承关系是不存在的。这一点,要与常识进行区分。

4.1 鸟类与企鹅

如果有两个类,一个是鸟类,一个是企鹅类,如果鸟是可以飞的,企鹅是不会飞的,那么企鹅是鸟么?企鹅可以继承鸟的这个类么?

在常识里,企鹅是属于鸟类的。但在面向对象的程序世界里,企鹅不能以父类---鸟的身份出现,因为企鹅不能飞,所以企鹅不是鸟,企鹅类不能继承鸟类。

4.2 长方形与正方形

类似的例子还有,例如“长方形与正方形”,“汽车与黄色汽车”等。

在长方形类中,属性长度和宽度是可以自由设置的,但在正方形类中,长宽是相同的。因此设计正方形类去继承长方形类,也是不合适的。

>本博客专注于技术分享,干货满满,持续更新。
>欢迎关注❤️、点赞

ABAP设计模式之---“里氏替换原则(Liskov Substitution Principle)”相关推荐

  1. Java设计模式之里氏替换原则(Liskov Substitution principle)

    2019独角兽企业重金招聘Python工程师标准>>> Java是面向对象的语言,那么什么是面向对象程序设计呢? 面向对象程序设计(英语:Object-oriented progra ...

  2. 软件设计原则(三)里氏替换原则 -Liskov Substitution Principle

    里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一. 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现. LSP是继承复用的基石,只 ...

  3. 设计模式之 里氏替换原则

    里氏替换原则(Liskov Substitution Principle, LSP):所有引用父类的地方必须能使用其子类的对象. 简单来说就是 子类拥有父类所拥有的一切,并可以在此基础上进而扩展其他的 ...

  4. 北风设计模式课程---里氏替换原则(Liskov Substitution Principle)

    北风设计模式课程---里氏替换原则(Liskov Substitution Principle) 一.总结 一句话总结: 当衍生类能够完全替代它们的基类时:(Liskov Substitution P ...

  5. 设计模式之里氏替换原则

    引入里氏替换原则(LiskovSubstitution Principle,LSP)的目的就是为了解决继承中父子类之间产生的强耦合性. 2.1 爱恨纠葛的父子关系 继承 在面向对象的语言中,继承是必不 ...

  6. 设计模式之里氏替换原则示例

    设计模式之里氏替换原则示例 里氏替换原则强调的是设计和实现要依赖于抽象而非具体:子类只能去扩展基类,而不是隐藏或者覆盖基类,它包含4层含义. 一.里氏替换4原则 1.子类可以实现父类的抽象方法,但不能 ...

  7. 设计模式:里氏替换原则

    里氏替换原则(Liskov Substitution Principle ,LSP): 指的是任何基类可以出现的地方,子类一定可以出现. 定义1 如果对每一个类型为T1的对象o1,都有类型为T2的对象 ...

  8. 设计模式:里氏替换原则(详解)

    里氏替换原则 前言 一. 介绍 二.代码演示 1.版本一:原始版本 2.版本二:里氏替换原则 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许 ...

  9. Java设计模式(03) -- 里氏替换原则

    六大设计原则 单一职责原则定义:约定一个类应该有且仅有一个改变类的原因: 开闭原则定义:规定软件中的对象.类.模块和函数对扩展应该是开放的,但对于修改是封闭的,核心思想也可以理解为面向抽象编程. 里氏 ...

最新文章

  1. 20120520 Linux下mysql的自动备份工具
  2. 项目管理难,如何高效地对项目进行管理?
  3. Windows下的鱿鱼(Squid)
  4. LockBits in GDI+【转】http://timothyqiu.com/archives/lockbits-in-gdiplus/
  5. LaText中插入带上下限的求和符号
  6. Eclipse 安装 SVN 插件的两种方法
  7. 直播安装vnc连接树莓
  8. c语言继续程序指令,C语言预处理程序
  9. 2021年必备 Python 插件!
  10. JAVA中文支持指南(Vera Yuanti)
  11. 前端面试题(附上自己的回答)
  12. 开源开放 | 一个用于知识驱动的零样本学习研究的开源数据集KZSL(CCKS2021)
  13. Sampling-Argmax:用重参数技巧优化Soft-Argmax
  14. Android 通知栏Notification的整合
  15. CDN与智能DNS 基本原理
  16. 【贰】人生穷富的关键
  17. 完全用Linux:半年来,Linux高效完成我所有的工作!(转贴)
  18. 时间序列预测——ARIMA
  19. 如何将自适应设计理论及韧性结构体系技术应用于穿越活动断裂带的隧道建设
  20. 晚风心里吹-粤语歌词谐音

热门文章

  1. MT7621_基础篇(2) 芯片资料了解 二
  2. dpi densityDpi的一些理解(慎入,不一定对)
  3. 第五人格服务器维修是什么意思,第五人格重新连接服务器是什么原因 第五人格重新连接服务器失败怎么办...
  4. Mapbox GL JS实现移动端H5实时多边形(涂鸦)绘制
  5. 互联网日报 | 天猫京东618再创新纪录;字节跳动成立抖音电商部门;全国普速铁路20日起实施电子客票...
  6. 面试官问,你有什么问题需要问我的吗?
  7. DNS 域名解析服务
  8. 计算机信息学院迎新篇,计算机科学学院顺利开展2019年秋季迎新活动
  9. FFmpeg 开发(04):FFmpeg + OpenGLES 实现音频可视化播放
  10. 华中科技大学计算机预推免2021,华中科技大学2021年各院系接收推荐免试攻读硕士学位和直接攻读博士学位研究生工作细则...