设计模式之美学习笔记17: 里氏替换原则(LSP)与多态的区别

设计模式之美学习笔记17: 里氏替换原则(LSP)与多态的区别

2019-12-11
Design Patterns

今天继续打卡学习极客时间上的专栏“设计模式之美”, 本篇是专栏第17节的学习笔记,介绍面向对象设计原则中的里氏替换原则。

笔记 #

面向对象有很多经典的设计原则:

  • SOLID5原则分别是
    • 单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖反转原则(DIP)
  • KISS - Keep It Simple, Stupid
  • YAGNI - You aren’t gonna need it
  • DRY - Don’t Repeat Yourself
  • LOD - Law of Demeter(迪米特法则,又叫做最少知识原则)

里氏替换原则 #

里氏替换原则: 子类对象能够替换程序中的父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏。 从定义描述和代码实现上来看,多态和里氏替换原则有点类似,但它们关注的角度是不一样的。多态是面向对象一大特性,是一种语法,是一种代码实现的思路。 里氏替换是一种设计原则,用来指导继承关系中子类如何设计,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性。

里氏替换原则还有一层按照协议来设计(Design By Contract)的意思。子类在设计时,要遵守父类的行为约定(协议)。父类定义了方法的行为约定,那子类可以改变方法的内部实现逻辑,但不能改变方法原有的行为约定。 这里的行为约定包括:

  • 函数声明要实现的功能
  • 对输入、输出、异常(错误)的约定
  • 甚至包括注释中所罗列的特殊说明

里氏替换原则原则中描述的父类和子类的关系,也可以替换成接口和实现类之间的关系。

违反里氏替换原则的情况:

  • 子类违背父类声明要实现的功能
  • 子类违背父类对输入、输出、异常(错误)的约定
  • 子类违背父类注释中所罗列的任何特殊说明

参考 #

© 2024 青蛙小白