里氏替换原则|设计原则

简介: 里氏替换原则的内容可以描述为: “派生类(子类)对象可以在程序中代替其基类(超类)对象。”

前置知识

  • 有项目编写经历
  • 做过代码的功能拓展
  • 听说过设计模式

前言

本文继续带大家学习 里氏替换原则

里氏替换原则 定义

里氏替换原则的内容可以描述为: “派生类(子类)对象可以在程序中代替其基类(超类)对象。”

上述解释来自百度,应该是机器直译的,所以听起来会较为抽象

下面我们可以看一下英文版本的描述

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。

其意思大致就是 子类可以扩展父类的功能,但不能改变父类原有的功能

也可以做如下解释(From:里式替换LSP)

子类对象(object of subtype/derived class)能够替换程序(program)中父类对象(object of base/parent class)出现的任何地方,并且保证原来程序的逻辑行为(behavior)不变及正确性不被破坏

乍一看,这个描述和多态极为相似,但是实际上,它们两者还是有着本质的区别的。

下文我们进行详细的分析

里氏替换原则的重点

里氏替换原则中,其特性是子类是可以替换父类,但是它更重要的是对该原则的限制,那就是保证原有程序的逻辑或者说正确性不遭受破坏

如何保证正确性不受破坏?

  1. 不得违反父类要实现的功能
  2. 不得违反父类的输入输出类型和范围
  3. 不得违反父类的注释说明

大致做到以上3点,遵从父类的约定,就可以保证原有程序不遭受破坏了

里式替换原则是用来指导,继承关系中子类该如何设计的一个原则。理解里式替换原则,最核心的就是理解“design by contract,按照协议来设计”这几个字。父类定义了函数的“约定”(或者叫协议),那子类可以改变函数的内部实现逻辑,但不能改变函数原有的“约定”。这里的约定包括:函数声明要实现的功能;对输入、输出、异常的约定;甚至包括注释中所罗列的任何特殊说明

里氏替换原则与多态的不同

从代码实现的层面来看,里氏替换原则和面向对象中的多态是很相似的,我们要理清他们的不同需要从他们的设计初衷的角度来看。

多态:是一种面向对象语言的特性,实现代码的一种方式。

里氏替换原则:一种编程的设计模式,主要用于指导和规范子类的设计

虽然从定义描述和代码实现上来看,多态和里式替换有点类似,但它们关注的角度是不一样的。多态是面向对象编程的一大特性,也是面向对象编程语言的一种语法。它是一种代码实现的思路。而里式替换是一种设计原则,用来指导继承关系中子类该如何设计,子类的设计要保证在替换父类的时候,不改变原有程序的逻辑及不破坏原有程序的正确性。


相关文章
七大设计原则之里氏替换原则应用
七大设计原则之里氏替换原则应用
155 0
|
关系型数据库 测试技术 程序员
面向对象设计原则~~~开闭原则
面向对象设计原则~~~开闭原则
87 0
|
设计模式 关系型数据库
软件架构设计原则之里氏替换原则
里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为T1的对象o1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1都替换成O2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。
77 0
|
设计模式 安全 Java
设计原则之接口隔离原则
设计原则之接口隔离原则
69 0
设计原则之接口隔离原则
|
设计模式 安全 Java
设计原则之依赖倒置原则
设计原则之依赖倒置原则
78 0
设计原则之依赖倒置原则
|
Java
深入理解开闭原则、里氏替换原则
深入理解开闭原则、里氏替换原则
195 0
软件架构设计原则--里氏替换原则
本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删
软件架构设计原则--里氏替换原则
|
设计模式
单一职责原则|设计原则
本文带大家学习和了解第一种设计原则,单一职责原则
|
Java API 开发工具
接口隔离原则|设计原则
今天为大家带来的依旧是 设计原则 的知识: 接口隔离原则
开闭原则|设计原则(二)
由于在软件体系中,唯一不变的,就是软件一直在变。