基本介绍
子类对象
能够替换程序中父类对象
出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。
和面向对象多态的区别
多态,通俗来说,就是多种形态。具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。比如manager继承了user。manager有系统所有权限,user有系统部分权限。
从定义描述和代码实现上来看,多态和里氏替换原则有点类似,但它们关注的角度是不一样的。多态是面向对象一大特性,是一种语法,是一种代码实现的思路。 里氏替换是一种设计原则,用来指导继承关系中子类如何设计,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性。
继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合度,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障。
里氏替换原则还有一层按照协议来设计
(Design By Contract)的意思。子类在设计时,要遵守父类的行为约定(协议)。父类定义了方法的行为约定,那子类可以改变方法的内部实现逻辑,但不能改变方法原有的行为约定。 这里的行为约定包括:
- 函数声明要实现的功能
- 对输入、输出、异常(错误)的约定
- 甚至包括注释中所罗列的特殊说明
里氏替换原则原则中描述的父类和子类的关系,也可以替换成接口和实现类之间的关系。
违反里氏替换原则的情况
- 子类违背父类声明要实现的功能
- 子类违背父类对输入、输出、异常(错误)的约定
- 子类违背父类注释中所罗列的任何特殊说明
替换的理解
替换的特性是面向对象语言所支持的多态的特性,同一个行为具有多种不同的表现形式和形态的能力
应用场景
使用里氏替换要求我们在编码时,使用基类或者接口去定义对象变量。可以使用具体对象进行赋值,实现代码的多样性,实现代码对修改的封闭,扩展的开放。
里氏代换原则与多态的区别 ?