设计模式原则 - 里氏替换原则

news2024/11/24 6:37:20

一 背景:

里氏替换原则是针对继承的。介绍前先聊聊继承性的特点

继承优势

  • 提高代码的复用性(每个子类有拥有父类的属性和方法)
  • 提高代码的可扩展性

继承劣势

  • 继承是侵入性的(只要继承,就必须拥有父类的属性和方法)
  • 继承机制很大的增加了耦合性

继承其实是一把双刃剑 》如何正确合理使用继承呢?》里氏替换原则

二 官方定义

里氏替换原则(Liskov Substitution Principle,LSP)是1988年,麻省理工学院一位姓里的女士提出 的,官方定义如下:
If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所有的对象
o1都代换成o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型
Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
所有引用基类的地方必须能透明地使用其子类的对象

基本介绍

里氏替换原则通俗的来讲:子类可以扩展父类的功能,但是子类不能修改父类原有的功能 ;只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误或者异常,使用者可能根本不需要知道是父类还是子类。但是反过来就不行了,有子类出现的地方,父类未必就能适应。
里氏替换原则就是给继承性的使用制定了规范

设计模式之里氏替换原则
在这里插入图片描述

  1. 子类必须实现父类的抽象方法,但不得重写(覆盖)父类的非抽象(已实现)方法。
  2. 子类中可以增加自己特有的方法。
  3. 当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。

子类如果方法形参范围变小了,那就是同名,不同参属于重载。也就是不同的方法了。在里氏替换原则要求下,就是子类的输入参数宽于或者等于父类的输入参数,也就是说写的这个方法不会呗调用。

  1. 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

父类的一个方法返回值是一个类型 T,子类的相同方法(重载重写)的返回值为S,那么里氏替换原则就要去S必须小于等于T,也就是说,要么S和T是同一类型,要么S是T的子类,为什么呢?重写就是同名同参,方法的范围值S小于等于T。这一点是我们一直都遵守的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

齐鲁转债上市价格预测

齐鲁转债基本信息转债名称:齐鲁转债,评级:AAA,发行规模:80.0亿元。正股名称:齐鲁银行,今日收盘价:4.28,转股价格:5.87。当前转股价值 转债面值 / 转股价格 *…

endo BCN-PEG4-COOH,endo BCN-四聚乙二醇-羧酸

中文名:endo BCN-四聚乙二醇-羧酸 英文名:endo BCN-PEG4-acid CAS号:1881221-47-1 分子式/分子量:C22H35NO8/441.5 结构式 溶解性:溶于大部分有机溶剂,如:DCM、DMF、DMSO、THF等等&#…

公务员备考(四十) 图推提升

第一章 平面专题总结 一、线总结 1、曲线直线 曲直图形判断原则:有曲则为曲,无曲才为直。阴影图形不讨论曲直性。 曲直规律图形特点:a.纯直线曲线图形;b.简笔画实物图形;c.单区域简单图形;d.内外结构图形 2、平行线(含回旋折线) a.轮廓自带平行线条;b.N字型、Z字…

Vs Code的使用

在上一章中有使用到Vs Code但是没有相关的介绍。 什么是Vs Code? 1、vscode是Microsoft公司在美国的一个项目:一个跨平台的源代码编辑器,用于在Mac OS X,Windows和Linux上运行的现代Web和云应用程序。通俗地说,是一款…

MapReduce案列-数据去重

文章目录一,案例分析(一)数据去重介绍(二)案例需求二,案例实施(一)准备数据文件(1)启动hadoop服务(2)在虚拟机上创建文本文件&#xf…

最新前端面试总结

介绍 plugin 插件系统是 Webpack 成功的一个关键性因素。在编译的整个生命周期中,Webpack 会触发许多事件钩子,Plugin 可以监听这些事件,根据需求在相应的时间点对打包内容进行定向的修改。 一个最简单的 plugin 是这样的: class Plugin{// …

自动驾驶CarSim和Simulink联合仿真的完美攻略!

作者 | 车路慢慢 仿真秀科普作者 导读:大家好,我叫李慢慢,仿真秀专栏作者,某汽车主机厂汽车仿真工程师,正在筹备转岗。自2020年起,我就在仿真秀App分享ANSA教程和攻略,并学习自动驾驶仿真。 中汽院智能网…

如何通过手机APP在线监控西门子PLC的运行状态

随着工业生产、制造环节的不断神话,工业设备越来越精细复杂,借助PLC实现的自动化控制技术被广泛的应用于工业领域中,具备丰富的应用场景。在物联网和无线通信技术的发展下,越来越多的工业企业系统通过手机APP监控现场PLC的运行状态…

《计算机视觉技术与应用》重点复盘

系列文章目录 《计算机视觉技术与应用》-----第二章 图像处理基础 《计算机视觉技术与应用》-----第三章 图形用户界面 《计算机视觉技术与应用》-----第四章 图像变换 《计算机视觉技术与应用》-----第五章 边缘和轮廓 《计算机视觉技术与应用》-----第六章 边缘和轮廓 …

使用Win32 API 渲染一个标准界面元素

有这么一个Win32 API,名叫 DrawFrameControl,它可以用来在你的自定义控件上渲染一些标准的窗口元素。 下面我们举一个简单的例子来说明。 在下面的例子中,我们会使用这个 API 函数来绘制一个已选择的单选按钮。具体方法是,在我们…

常见面试题(随机)

常问的几个方面 1.MySQL 存储引擎、事务、锁、索引 2.Redis 数据类型、过期策略、淘汰策略、缓存穿透、缓存击穿、缓存雪崩、分布式锁 3. Spring Spring Ioc、Spring AOP、Spring MVC MYSQL 存储引擎 事务 事务的特性 原子性、一致性、隔离性、持久性事务的隔离性并发异常:…

Stm32标准库函数2——多通道ADC DMA

#include "stm32f10x.h" //在该头文件中默认定义系统时钟为72M #include "delay.h" #include "sys.h" #include "usart.h" #include "adc.h" #include "DMA.h" //串口:A9 A10,波特率11…

linux-12月第四周-磁盘存储和文件系统

文章目录管理存储使用磁盘空间过程为什么要磁盘分区划分分区的方式MBR管理存储 使用磁盘空间过程 买来一块新硬盘后,有以下三个使用步骤 第一步:划分分区(将硬盘划分为若干个分区,windows上的C盘,D盘,E盘…

SCUT01在线协作白板技术解决方案

在七牛云校园黑客马拉松中,来自华南理工大学的SCUT01团队,为我们带来了UI精美、体验优秀的白板作品,在大赛中获得二等奖的好成绩。以下是这款在线协作白板的技术解决方案。 背景 疫情背景下,线上课堂、线上会议等业务背景下都有着…

PCL 点云配准衡量指标

0. 简介 PCL作为目前最为强大的点云库,内部存在有大量集成好的算法。而对于数据量大、非同源、含大量噪声且部分重叠的激光点云与影像重建点云,其稀疏程度、噪声程度等不同,非重叠区域的面积很大。真实场景的点云尤其是影像重建点云噪声较多…

用javascript分类刷leetcode23.并查集(图文视频讲解)

并查集(union & find):用于处理一些元素的合并和查询问题 Find:确定元素属于哪一个子集,他可以被用来确定两个元素是否属于同一个子集,加入路径压缩,复杂度近乎O(1) Union:将两…

如何在 ESXi 7.x 上安装 Windows Server 2019

安装 Windows Server 2019 连接 ESXi 7.0上传 Windows Server 2019 镜像创建虚拟机安装 Windows Server 2019在本文中,我们将逐步在 ESXi 7.x 上安装 Windows Server 2019。 连接 ESXi 7.0 使用 VMware 主机或 vSphere Web 客户端连接到 VMware vSphere Hypervisor 7.0(ESX…

Unity-ROS与话题与服务(二)

0. 简介 对于ROS而言,其最常用的就是Topic话题以及Service两个了。之前我们在了解Unity Robotics Hub时候就了解到基本的Unity和ROS的通讯,下面我们来详细介绍一下Unity与ROS的话题与服务。 ROS和Unity之间的通信是通过Unity的“ROS-TCP-Connector”软…

Linux学习07-vim程序编辑器

1 vi与vim vi 是老式的文书处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具,就连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个“程序开发工具”而…