前置知识
- 有项目编写经历
- 做过代码的功能拓展
- 听说过设计模式
前言
本文继续带大家学习 里氏替换原则
里氏替换原则 定义
里氏替换原则的内容可以描述为: “派生类(子类)对象可以在程序中代替其基类(超类)对象。”
上述解释来自百度,应该是机器直译的,所以听起来会较为抽象
下面我们可以看一下英文版本的描述
If S is a subtype of T, then objects of type T may be replaced with objects of type S, without breaking the program。
Functions that use pointers of references to base classes must be able to use objects of derived classes without knowing it。
其意思大致就是 子类可以扩展父类的功能,但不能改变父类原有的功能。
也可以做如下解释(From:里式替换LSP)
子类对象(object of subtype/derived class)能够替换程序(program)中父类对象(object of base/parent class)出现的任何地方,并且保证原来程序的逻辑行为(behavior)不变及正确性不被破坏
乍一看,这个描述和多态极为相似,但是实际上,它们两者还是有着本质的区别的。
下文我们进行详细的分析
里氏替换原则的重点
里氏替换原则中,其特性是子类是可以替换父类,但是它更重要的是对该原则的限制,那就是保证原有程序的逻辑或者说正确性不遭受破坏。
如何保证正确性不受破坏?
- 不得违反父类要实现的功能
- 不得违反父类的输入输出类型和范围
- 不得违反父类的注释说明
大致做到以上3点,遵从父类的约定,就可以保证原有程序不遭受破坏了
里式替换原则是用来指导,继承关系中子类该如何设计的一个原则。理解里式替换原则,最核心的就是理解“design by contract,按照协议来设计”这几个字。父类定义了函数的“约定”(或者叫协议),那子类可以改变函数的内部实现逻辑,但不能改变函数原有的“约定”。这里的约定包括:函数声明要实现的功能;对输入、输出、异常的约定;甚至包括注释中所罗列的任何特殊说明
里氏替换原则与多态的不同
从代码实现的层面来看,里氏替换原则和面向对象中的多态是很相似的,我们要理清他们的不同需要从他们的设计初衷的角度来看。
多态:是一种面向对象语言的特性,实现代码的一种方式。
里氏替换原则:一种编程的设计模式,主要用于指导和规范子类的设计
虽然从定义描述和代码实现上来看,多态和里式替换有点类似,但它们关注的角度是不一样的。多态是面向对象编程的一大特性,也是面向对象编程语言的一种语法。它是一种代码实现的思路。而里式替换是一种设计原则,用来指导继承关系中子类该如何设计,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑及不破坏原有程序的正确性。