L 里式替换原则
Liskov Substitution Principle,LSP
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.
子类对象能够替换程序中父类对象出现的任何地方,并且能保证原来程序的逻辑行为不变、正确性不被破坏
Design By Contract,按照协议来设计
子类在设计的时候,要遵守父类的行为约定(或者协议)
父类定义了函数的行为约定,那子类可以改变函数的内部实现逻辑,但不能改变函数原有的行为约定。这里的行为约定包括:函数声明要实现的功能;对输入、输出、异常的约定;甚至包括注释中所罗列的任何特殊说明
实际上,定义中父类和子类之间的关系,也可以替换成接口和实现类之间的关系
里式替换原则是用来指导继承关系中子类该如何设计的一个原则
多态 vs 里式替换原则:
虽然从定义描述和代码实现上来看,多态和里式替换有点类似,但它们的关注角度不一样。
多态是面向对象编程的一大特性,也是面向对象编程语言的一种语法。它是一种代码实现的思路
里式替换是一种设计原则,是用来指导继承关系中子类该如何设计的,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性
比如:有些使用多态语法来实现功能的代码,却不一定满足里式替换原则
应用:
哪些代码是违反里式替换原则的?
子类违背父类声明要实现的功能
子类违背父类对输入、输出、异常的约定
子类违背父类注释中所罗列的任何特殊说明
如何将它们改造成满足里式替换原则?
小窍门:拿父类的单元测试去验证子类的代码。如果某些单元测试运行失败,就有可能说明子类的设计实现没有完全地遵守父类的约定,子类有可能违背了里式替换原则
Last updated