里氏替换原则在继承关系中子类对父类方法的重写(覆盖)或重载时应遵循的规则
什么是里氏替换原则:只要父类能出现的地方子类就可以出现,而且 替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。
简而言之,子类在重写或重载父类的方法时,对方法的返回值或输入参数应该是“小于等于”(或更具体)于父类的方法。这里的“小于等于”指的是继承关系中子类方法的行为不应该超出父类方法的行为范围。
为了更好地理解,让我们来解释一下含义:
-
覆写(Override)的情况: 当子类覆写父类的方法时,子类的方法应该具有相同的方法名、相同的输入参数,但方法体可以重新实现。在这种情况下,方法的返回值类型(也称为方法的协变类型)应该是父类方法返回值类型的子类型(即小于等于父类返回值类型)。这是为了确保子类的行为不会超过父类的行为范围。
-
重载(Overload)的情况: 重载是指在同一个类中,方法名相同但输入参数不同的情况。在继承关系中,子类可以重载父类的方法,但是子类重载的方法应该有更宽松的输入参数要求,即子类的输入参数类型应该是父类的输入参数类型的父类型(即宽于或等于父类输入参数类型)。这是为了确保子类方法可以适用于更广泛的输入。
总结起来,LSP要求子类覆写的方法不应该做超出父类方法行为范围的事情,而子类重载的方法应该具有更广泛的输入参数要求。这样可以保证在使用子类对象替代父类对象时,不会出现意外的行为,同时保持了代码的可靠性和一致性。
总结一下:
1、覆写是返回值的范围应该变小(确保行为范围),重载是入参的范围应该变大。
2、同时类的覆写和类的重载本身与返回值没有关系。
子类中方法的前置条 件必须与超类中被覆写的方法的前置条件相同或者更宽松
这句话在讲述里氏替换原则(Liskov Substitution Principle,LSP)中的另一个关键概念,即子类中覆写(重写)方法的前置条件(preconditions)与父类中被覆写方法的前置条件相比应该保持相同或者更宽松。
前置条件指的是方法执行前需要满足的一些条件,以确保方法的正常执行。里氏替换原则要求:
-
相同的前置条件: 子类中覆写父类方法时,子类方法的前置条件必须与父类方法的前置条件相同。这意味着在调用子类方法之前,所需的条件和约束应该与调用父类方法时相同,以确保代码的稳定性和可预测性。
-
更宽松的前置条件: 子类方法的前置条件可以比父类方法更宽松。这是为了增强子类的灵活性和适用性。如果子类方法的前置条件比父类方法宽松,那么意味着子类方法可以在更多的情况下被调用,而不会破坏程序的正确性。
总之,这一原则确保了子类的方法在被调用时,能够满足至少与父类方法相同的前置条件,以及更宽松的前置条件,从而避免了在子类中破坏父类行为的情况。这有助于保持代码的合理性和可维护性。
demo:
public class Father {public Collection doSomething(Map map) {System.out.println("父类被执行...");return map.values();}
}public class Son extends Father {//子类的范文更小,所以最后没有满足 里氏替换原则public Collection doSomething(HashMap map) { System.out.println("子类被执行...");return map.values();}
}public class Client {public static void invoker() {Father f = new Father();HashMap map = new HashMap();f.doSomething(map);}public static void main(String[] args) {invoker(); //父类被执行...}
}public class Client {public static void invoker() {Son f = new Son();HashMap map = new HashMap();f.doSomething(map);}public static void main(String[] args) {invoker(); //子类被执行... 没有满足 里氏替换原则}
}
相关文章:
里氏替换原则在继承关系中子类对父类方法的重写(覆盖)或重载时应遵循的规则
什么是里氏替换原则:只要父类能出现的地方子类就可以出现,而且 替换为子类也不会产生任何错误或异常,使用者可能根本就不需要知道是父类还是子类。但是,反过来就不行了,有子类出现的地方,父类未必就能适应。…...
【脑机接口开源数据处理包】brainflowBrainFlow是一个库,旨在获取,解析和分析脑电图,肌电图,心电图和其他类型的数据从生物传感器。
BrainFlow是一个库,旨在获取,解析和分析脑电图,肌电图,心电图和其他类型的数据从生物传感器。 brainflow开源库官网地址 [https://brainflow.readthedocs.io/en/stable/](https://brainflow.readthedocs.io/en/stable/) 它提供了…...
#452. 序列操作
序列操作 - 题目 - Daimayuan Online Judge 问题描述: 思路:首先想的是第二次操作的y可以将前面所以操作进行抵消,只需要第二次操作的最大值即可。但是发现,对于第一个操作,它是单点修改,每修改一次对于第…...
《Python深度学习-Keras》精华笔记3:解决深度学习多分类问题
公众号:机器学习杂货店作者:Peter编辑:Peter 持续更新《Python深度学习》一书的精华内容,仅作为学习笔记分享。 本文是第三篇:介绍如何使用Keras解决Python深度学习中的多分类问题。 多分类问题和二分类问题的区别注意…...
区块链世界的大数据入门之zkMapReduce简介
1. 引言 跨链互操作性的未来将围绕多链dapp之间的动态和数据丰富的关系构建。Lagrange Labs 正在构建粘合剂,以帮助安全地扩展基于零知识证明的互操作性。 2. ZK大数据栈 Lagrange Labs 的ZK大数据栈 为一种专有的证明结构,用于在任意动态分布式计算的…...
Python流程控制语句-条件判断语句练习及应用详解
文章目录 简介条件判断语句(if语句)练习1:判断奇偶数练习2:判断闰年练习3:计算狗的年龄相当于人的年龄练习4:根据成绩奖励练习5:选择婚姻对象 小结 python 学习专栏推荐python基础知识ÿ…...
(十)ElasticSearch高级使用【别名,重建索引,refresh操作,高亮查询,查询建议】
1.别名使用 1)别名作用 在开发中,随着业务需求的迭代,较⽼的业务逻辑就要⾯临更新甚⾄是重构,⽽对于es来说,为了 适应新的业务逻辑,可能就要对原有的索引做⼀些修改,⽐如对某些字段做调整&…...
基于小波神经网络的中药材价格预测,基于ANN的小波神经网络中药材价格预测
目标 背影 BP神经网络的原理 BP神经网络的定义 BP神经网络的基本结构 BP神经网络的神经元 BP神经网络的激活函数, BP神经网络的传递函数 小波神经网络(以小波基为传递函数的BP神经网络) 代码链接:基于小波神经网络的中药材价格预测,ANN小波神经网络中药材价格预测资源-CS…...
thinkPhp5返回某些指定字段
//去除掉密码$db new UserModel();$result $db->field(password,true)->where("username{$params[username]} AND password{$params[password]}")->find(); 或者指定要的字段的数组 $db new UserModel();$result $db->field([username,create_time…...
基于docker环境的tomcat开启远程调试
背景: Tomcat部署在docker环境中,使用rancher来进行管理,需要对其进行远程调试。 操作步骤: 1.将容器中的catalina.sh映射出来,便于对其修改,添加远程调试相关参数。 注意:/data/produce2201…...
ELK日志框架图总结
ELK日志框架图总结 本文目录 ELK日志框架图总结Elastic Stack介绍模式分层图beatselasticsearchkibana模式logstashelasticsearchkibana模式beatslogstashelasticsearchkibana模式beats缓存/消息队列logstashelasticsearchkibana模式elkspringboot Elastic Stack介绍 官网&…...
go 每天定时任务 --chatGPT
问:clearLog(hour,cmds),定时执行shell 命令,hour 为每天的几点,cmds 为linux命令数组字符串(如 1,{"ls","cd"}) gpt: 要编写一个 Go 函数 clearLog,该函数可…...
Lightdb 23.3 plorasql函数支持DML
开篇立意 oracle在函数中使用dml语句时,有两者情况。即:(1)直接使用select调用该函数;(2)在匿名块中调用该函数。 针对第一种情况我们测试一下 简单的函数: create table nested_t…...
电容笔值不值得买?开学季比较好用的电容笔
眼看着新学期即将到来,到底应该选择什么样的电容笔?一款原装的苹果Pencil,就卖到了将近一千块,这对于很多人来说,都是一个十分昂贵的价格。事实上,由于平替电容笔的价格非常便宜,只要一二百元就…...
Mybatis 框架 ( 五 ) 分页
4.6.分页 Mybatis-plus 内置分页插件, 并支持多种数据库 官网 : 分页插件 | MyBatis-Plus (baomidou.com) 4.6.1.增加拦截器 通过 MapperScan 指定 mapper接口的路径 import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plug…...
Python模板注入
概念 发生在使用模板引擎解析用户提供的输入时。模板注入漏洞可能导致攻击者能够执行恶意代码或访问未授权的数据。 模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码分离。即也拓宽了攻击面,注入到模板中的代码可…...
Java常用的设计模式
单例模式(Singleton Pattern): 确保一个类只有一个实例,并提供一个全局访问点。示例:应用程序中的配置管理器。 工厂模式(Factory Pattern): 用于创建对象的模式,封装对象的创建过程。示例&…...
攻防世界-WEB-Web_php_include
打开靶机 通过代码审计可以知道,存在文件包含漏洞,并且对伪协议php://进行了过滤。 发现根目录下存在phpinfo 观察phpinfo发现如下: 这两个都为on 所以我们就可以使用data://伪协议 payload如下: - ?pagedata://text/plain,…...
angular中多层嵌套结构的表单如何处理回显问题
最近在处理angular表单时,有一个4层结构的表单。而且很多元素时动态生成,如下: this.validateFormthis.fb.group({storeId: ["test12"],storeNameKey:[],config:this.fb.group({ tableSize:this.fb.group({toggle:[false],groupSiz…...
Leetcode646. 最长数对链
Every day a Leetcode 题目来源:646. 最长数对链 解法1:动态规划 定义 dp[i] 为以 pairs[i] 为结尾的最长数对链的长度。 初始化时,dp 数组需要全部赋值为 1。 计算 dp[i] 时,可以先找出所有的满足 pairs[i][0]>pairs[j]…...
Windows 下安装NPM
第一步: 下载node.js的windows版 当前最新版本是https://nodejs.org/dist/ 第二步:设置环境变量 把node.exe所在目录加入到PATH环境变量中。 配置成功后可以在CMD中通过node --version 看到node.js对应的版本号 C:\Users\fn>node --version v6.10.2 第三步: 安装git 直接…...
【ARM CoreLink 系列 2 -- CCI-400 控制器简介】
文章目录 CCI-400 介绍DVM 机制介绍DVM 消息传输过程TOKEN 机制介绍 下篇文章:ARM CoreLink 系列 3 – CCI-550 控制器介绍 CCI-400 介绍 CCI(Cache Coherent Interconnect)是ARM 中 的Cache一致性控制器。 CCI-400 将 Interconnect 和coh…...
LeetCode(力扣)77. 组合Python
LeetCode77. 组合 题目链接代码 题目链接 https://leetcode.cn/problems/combinations/description/ 代码 class Solution:def combine(self, n: int, k: int) -> List[List[int]]:result []return self.backtracking(n, k, 1, [], result)def backtracking(self, n, k…...
uniapp h5 微信缓存,解决版本更新还是旧版本
文章目录 一、微信缓存是什么?二、如何解决1.打包入口文件解决2.给请求url加时间戳3.给打包的js文件添加时间戳并修改打包后的css文件夹 总结 一、微信缓存是什么? 微信缓存是指微信客户端为了提高用户的使用体验,会在用户使用微信过程中将一…...
Nacos——Distro一致性协议
Nacos——Distro一致性协议 1. 理论 一致性一直都是分布式系统中绕不开的话题。根据CAP中,要么CP(保证强一致性牺牲可用性),要么AP(最终一致性来保证可用性),在市面上也有几种一致性算法,像Paxos,Raft,Zoo…...
大模型参数高效微调PEFT的理解和应用
简介 近年的大型语言模型(也被称作基础模型),大多是采用大量资料数据和庞大模型参数训练的结果,比如常见的ChatGPT3有175B的模型参数量。随着Large Language Model(LLM)的横空出世,网络模型对常见问题的解答有了很强的…...
工作游戏时mfc140u.dll丢失的解决方法,哪个方法可快速修复mfc140u.dll问题
在 Windows 操作系统中,mfc140u.dll 文件是非常重要的一个组件,许多基于 MFC(Microsoft Foundation Classes)的程序都需要依赖这个文件。然而,有些用户在运行这些程序时可能会遇到mfc140u.dll丢失的问题,导…...
选择排序——直接选择排序
直接选择排序:(以重复选择的思想为基础进行排序) 1、简述 顾名思义就是选出一个数,再去抉择放哪里去。 设记录R1,R2…,Rn,对i1,2,…,n-1,重复下…...
【C++基础】观察者模式(“发布-订阅”模式)
本文参考:观察者模式 - 摩根斯 | 爱编程的大丙 观察者模式允许我们定义一种订阅机制,可在对象事件发生时通知所有的观察者对象,使它们能够自动更新。观察者模式还有另外一个名字叫做“发布-订阅”模式。 发布者: 添加订阅者&…...
从业多年,我总结出软件测试工程师必须掌握的技能,你不可错过!
经常会有小伙伴询问:“测试工程师有哪些必须要掌握的技能?”这是一个非常大的课题,因为每个人从事的行业不同、岗位不同,需要掌握的技能自然也不一样。 今天小编就从不同岗位、不同行业两个大方面,来讲讲软件测试工程师…...
b2b网站推广技巧/深圳百度快速排名提升
备注:查询时按ctrlf,方便快速查找。小型汽车(蓝牌)川A77HE2 川A9Z05P 川AH39B7 川AJ20N2 川AU7X72 川AV228N川HF3109 川JU9108 川YN4946 鄂A07ZY2 鄂A16KL8 鄂A23B47鄂A23BA7 鄂A6Q120 鄂A71NS2 鄂A71NW9 鄂A83P99 鄂AC1J17鄂AHP189 鄂AR65M1 鄂AV3A97 鄂…...
黄色的html代码/seo下拉优化
1.下载安装qrcodejs2包 npm i qrcodejs2 2.导入 import QRCode from "qrcodejs2"; 3.html <div class"qrcode" id"qrcode"></div> //class是我的样式可以忽略,但是id一定要下 4.使用,以下是我的代码&…...
网站免费云主机/网站推广的方法有哪些?
本博客已搬家 地址:www.czhphp.com 所有更新都会在新博客进行 谢谢大家的支持! (一). Asp.net Ajax框架教程http://blog.csdn.net/ChengKing/archive/2008/01/09/2032497.aspx(二).Silverlight入门教程(基于Asp.net运行环境示例)http://blog.csdn.net/C…...
网站建设及数据分析/成都调查事务所
k个男生和k个女生站成一列,前面k个是男生,后面k个是女生,从第一个男生开始报数,报到队列最后一个同学,循环到队首继续报,并且如果一个同学报到的数是m,这个同学就出列,然后后面的同学…...
好的手机端网站模板下载软件/目前推广软件
1.Number.EPSILON是JS表示的最小精度 function add(a,b){if(Math.abs(a-b)<Number.EPSILON){return true;}else{return false} } console.log(add(0.10.2,0.3)) //true 2.Number.isFinite检测一个数值是否为有限数 3.Number.isNaN检测一个数值是否为NaN 4.Number.parse…...
seo网站建设方案/对搜索引擎优化的认识
1.公式的转化 我们都知道在latex上编写公式非常简便,他有一套自己的语言支持。 但是复杂的公式在word上编写十分麻烦,那如何将latex上的公式无缝的对接到word上呢? 一个在线转变网站 使用: $$ \mathbf{G} \left[\begin{matrix}g…...