里氏替换原则


文档摘要

里氏替换原则 里氏替换原则,Liskov Substituion Principle,简称 LSP,一个软件实体如果使用的是一个父类的话,一定适用于其子类,而且它察觉不出父类和子类的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。简单来说,子类型必须能够替换掉它们的父类型。 使用动机 父类能够真正复用(继承),子类也能够在父类的基础上增加新的行为。 如何使用 父类一般使用抽象类或接口。 抽象类定义公共对象和状态;接口定义公共行为。 子类通过继承父类和接口进行扩展。 使用原则 子类方法的参数类型必须与父类相匹配或更抽象。 子类的返回值类型必须与父类或其子类相匹配。 子类方法的异常必须与父类能抛出的异常(或其子类)相匹配。 子类不应该加强参数条件限制。

里氏替换原则

里氏替换原则,Liskov Substituion Principle,简称 LSP,一个软件实体如果使用的是一个父类的话,一定适用于其子类,而且它察觉不出父类和子类的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。简单来说,子类型必须能够替换掉它们的父类型。

使用动机

父类能够真正复用(继承),子类也能够在父类的基础上增加新的行为。

如何使用

  • 父类一般使用抽象类或接口。
  • 抽象类定义公共对象和状态;接口定义公共行为。
  • 子类通过继承父类和接口进行扩展。

使用原则

  • 子类方法的参数类型必须与父类相匹配或更抽象。
  • 子类的返回值类型必须与父类或其子类相匹配。
  • 子类方法的异常必须与父类能抛出的异常(或其子类)相匹配。
  • 子类不应该加强参数条件限制。
  • 子类不能修改父类的私有成员变量。

使用示例

以企鹅和鸟为例。

假设鸟是父类,有下蛋和飞翔两个方法。企鹅作为鸟如果继承了父类,就会出现问题,因为企鹅虽然有翅膀但不会飞。所以,这样设计父类和子类是不合理的,它违反了上面提到的原则,企鹅作为子类无法替换父类。

合理的做法是将飞翔的行为抽象为接口,父类鸟描述状态和公共方法(比如吃),然后会飞的子类再去实现飞翔接口,不会飞的就不用管了。


作者与出处
原作者: Datawhale
来源:Datawhale
许可证:CC BY-NC-SA 4.0
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: Datawhale 转发
评论区 (0)
U