设计模式之美学习笔记17: 里氏替换原则(LSP)与多态的区别
2019-12-11
今天继续打卡学习极客时间上的专栏“设计模式之美”, 本篇是专栏第17节的学习笔记,介绍面向对象设计原则中的里氏替换原则。
笔记 #
面向对象有很多经典的设计原则:
- SOLID5原则分别是
- 单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖反转原则(DIP)
- KISS - Keep It Simple, Stupid
- YAGNI - You aren’t gonna need it
- DRY - Don’t Repeat Yourself
- LOD - Law of Demeter(迪米特法则,又叫做最少知识原则)
里氏替换原则 #
里氏替换原则: 子类对象能够替换程序中的父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。 从定义描述和代码实现上来看,多态和里氏替换原则有点类似,但它们关注的角度是不一样的。多态是面向对象一大特性,是一种语法,是一种代码实现的思路。 里氏替换是一种设计原则,用来指导继承关系中子类如何设计,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性。
里氏替换原则还有一层按照协议来设计
(Design By Contract)的意思。子类在设计时,要遵守父类的行为约定(协议)。父类定义了方法的行为约定,那子类可以改变方法的内部实现逻辑,但不能改变方法原有的行为约定。
这里的行为约定包括:
- 函数声明要实现的功能
- 对输入、输出、异常(错误)的约定
- 甚至包括注释中所罗列的特殊说明
里氏替换原则原则中描述的父类和子类的关系,也可以替换成接口和实现类之间的关系。
违反里氏替换原则的情况:
- 子类违背父类声明要实现的功能
- 子类违背父类对输入、输出、异常(错误)的约定
- 子类违背父类注释中所罗列的任何特殊说明