里氏替换原则
里氏替换原则
里式替换原则(Liskov Substitution Principle
,LSP
)。
英文描述:
1 | Functions that use pointers of references to base classes must be able to use objects of derived classes without knowing it |
中文翻译:
1 | 子类对象(`object of subtype`/`derived class`)能够替换程序中父类对象(`object of base`/`parent class`)出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。 |
一、如何理解“里式替换原则”?
里式替换是一种设计原则,是用来指导继承关系中子类该如何设计的。
- 子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性
里式替换原则还有一个更实在的描述:
- “Design By Contract”,即“按照协议来设计”
协议的意思就是,当父类定义了函数的行为约定时,
- 子类可以改变函数的内部实现逻辑,但不能改变父类函数原有的行为约定
一般来说,父类设计的行为约定包括:
- 父类函数声明要实现的功能
- 父类对输入、输出、异常的约定
- 父类注释中所罗列的任何特殊说明,比如范围、格式等
子类设计不遵循这些约定时,都算是违反了里氏替换原则。
二、如何判断是否违反了 LSP?
判断子类的设计违反了里氏替换原则的几种情况:
- 子类违背父类声明要实现的功能
- 子类违背父类对输入、输出、异常的约定
- 子类违背父类注释中所罗列的任何特殊说明
额外的小窍门:
- 拿父类的单元测试去验证子类的代码,如果运行失败,那就是违反了里氏替换原则
可能的情况就是,子类的实现没有完全地遵守父类的约定。