转载自 面象对象设计6大原则之三:里氏替换原则

里氏替换原则(LSP),The Liskov Substitution Principle

定义

所有引用基类的地方必须能透明地引用其子类的对象,即子类可以拓展父类的功能,但不能修改父类已有的功能。

也就是说在父类出现的地方子类也可以出现,并且替换为子类也不会报错,引用者根本不需要知道引用的是父类还是子类,但是反过来就行不通了,子类出现的地方父类就不一定能出现并代替子类。

里氏替换原则的特点:

1、子类可以拓展父类的功能,但不能修改父类已有的功能,如果修改了父类已有的功能,可能导致父类定义的功能在子类覆盖后不适用。

2、重载父类的方法时,子类的方法形参应该比父类更宽松。

3、实现父类的抽象方法时,子类的方法输出结果应该比父类更加严格。

4、子类可以有自己独特的私有方法,但是需要注意的是,如果子类不能完全实现父类的方法,或者父类的某一些方法在子类中已经不适用,这种情况则建议断开父子关系,使用组合等方式代替继承出现。

里氏替换原则的优缺点:

1、合理得用类的继承关系,提高了代码的复用性,但也增强了类与类之间的耦合性。

2、通过建立抽象,运行过程中具体实现取代抽象,保证了系统的可拓展性。

3、只要继承父类就拥有父类的全部属性和方法,这样减少了代码重复创建量共享了代码但也约束了子类的行为,降低了系统灵活性。

我们平时开发中可能没考虑这么多,乱覆盖父类的方法,没有多少联系的继承等很多打破了里氏替换的原则,这样不顾后果的后果就是我们写的程序存在着潜在的漏洞,而且出问题的机率也会显著提升。

面象对象设计6大原则之三:里氏替换原则相关推荐

  1. 面象对象设计6大原则之六:迪米特原则

    转载自 面象对象设计6大原则之六:迪米特原则 迪米特原则(LOD),The Law Of Demeter,也称为最少知识原则 定义 一个对象应该对其他对象有最少的了解. 也就是说一个类耦合和调用一个类 ...

  2. 面象对象设计6大原则之五:依赖倒置原则

    转载自 面象对象设计6大原则之五:依赖倒置原则 依赖倒置原则(DIP),The Dependency Inversion Principle 定义 1.高层模块不应该依赖低层模块,两都应该依赖于抽象. ...

  3. 面象对象设计6大原则之四:接口隔离原则

    转载自 面象对象设计6大原则之四:接口隔离原则 接口隔离原则(ISP),The Interface Segregation Principle 定义 客户端不需要强迫依赖那些它们不需要的接口. 类与接 ...

  4. 面象对象设计6大原则之二:开放封闭原则

    转载自 面象对象设计6大原则之二:开放封闭原则 开放封闭原则(OCP),The Open Closed Principle 定义 一个软件的实体,包括类.方法.模块.应该对扩展开放,对修改关闭. 也就 ...

  5. 面象对象设计6大原则之一:单一职责原则

    转载自 面象对象设计6大原则之一:单一职责原则 单一职责原则(SRP),The Single Responsibility Principle 定义 一个类的修改只能有一个被修改的原因. 通俗地讲,就 ...

  6. 6大设计原则之里氏替换原则

    面对对象中的继承 优点如下: 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性 提高代码的重用性 子类可以形如父类,但又异于父类 提高代码的可扩展性,很多开源框架的扩展接口都是通过继承父类 ...

  7. 软件设计原则之里氏替换原则、依赖倒置原则

    系列文章目录 软件设计原则之单一职责原则.开闭原则 软件设计原则之里氏替换原则.依赖倒置原则 软件设计原则之接口隔离原则.合成复用原则.迪米特原则 文章目录 系列文章目录 一.里氏替换原则 什么是里氏 ...

  8. 七大设计原则之里氏替换原则应用

    目录 1 里氏替换原则 2 里氏替换原则应用 1 里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为 T1 的对象 o1,都有类型为 ...

  9. python里氏替换原则_设计模式六大原则之里氏替换原则

    这是设计模式6 大原则系列的第二篇文章,附上前一篇文章地址:设计模式六大原则之单一职责原则.本文主要讲解设计模式的里氏替换原则. 肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑.其 ...

最新文章

  1. 非root用户编译安装源码包
  2. 【caffe-Windows】mnist实例编译之model的使用-classification
  3. (chap1 web网络基础) TCP/IP协议层
  4. webpack入门与笔记
  5. mysql100个优化技巧_完整篇:100+个MySQL调试和优化技巧(2)
  6. hadoop--HDFS_DataNode工作机制
  7. 用实例的方式去理解storm的并发度
  8. 容器入门(2) - podman
  9. JavaScript创建对象的三种方式之利用字面量创建对象及使用方法(1)
  10. BITED数学建模七日谈之一:参加全国大学生数学建模比赛前你需要积累哪些
  11. linux:文件及目录管理
  12. mysql MyISAM和InnoDB
  13. Win10快捷键大全
  14. C语言实现99乘法表
  15. Echarts 配置渐变
  16. excel小技巧 生成递增时间区间
  17. QML Label/Text 文本居中显示
  18. 葫芦娃登录后显示服务器维护,葫芦娃手游新手常见问题解答
  19. 虚幻引擎(12)-游戏界面
  20. centos7解决hadoop2.6.4多次格式化导致的slaver节点datanode无法启动的问题

热门文章

  1. [JavaWeb-CSS]CSS基础选择器
  2. 高等数学上-赵立军-北京大学出版社-题解-练习5.3
  3. The Last Non-zero Digit POJ - 1150(n!mod p)
  4. libjpeg: cannot open
  5. Qt 调试Caffe
  6. P3711 仓鼠的数学题(伯努利数)
  7. HDU 4812 D Tree (点分治) (2013ACM/ICPC亚洲区南京站现场赛)
  8. P4239 任意模数多项式乘法逆(多项式/ MTT)
  9. Codeforces Round #720 (Div. 2) C. Nastia and a Hidden Permutation 交互
  10. 【Hitachi2020C】ThREE【构造】【二分图染色】