设计模式原则 - 里氏替换原则(四)

news2024/11/23 8:02:14

一 背景:

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

继承优势

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

继承劣势

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

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

二 官方定义

里氏替换原则(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/100642.html

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

相关文章

Linux中的Chrony时间同步服务

目录 一、时间同步 1.概念 2.时间同步在运维工作中的作用 3.时间同步完成方法 (1)NTP时间服务(centos 6 ) (2)Chrony时间服务 二、Chrony时间服务 1.Chrony介绍 2.Chrony的优点 三、Chrony安装 …

linux基础学习-基本命令

基本命令 拷贝和移动 tree[目录名]:以树状图列出文件目录结构 -d:只显示目录cp 源文件 目标文件:复制文件或者目录 -f:已存在的目标文件直接覆盖,不会提示-i:覆盖文件前提示-r:若给出的源文件是…

SQLMAP高级用法

目录 前言 一、语法 1.利用google浏览器进行批量扫描 2.针对http请求头进行扫描 3.写入shell的几种方法 4.挂代理的方式 二、演示 1.批量扫描谷歌代理 2.http请求ua扫描 3.写入shell(一) 4.写入shell(二) 三、小结 前…

[附源码]计算机毕业设计Python的花店售卖系统的设计与实现(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

Windows与网络基础 | 管理_NTFS_注册表... | 系统性学习 | 无知的我费曼笔记

无知的我正在复盘Windows与网络基础 该笔记特点是 重新整理了涉及资料的一些语言描述、排版而使用了自己的描述对一些地方做了补充说明。比如解释专有名词、类比说明、对比说明、注意事项提升了总结归纳性。尽可能在每个知识点上都使用一句话 || 关键词概括更注重在实际上怎么…

【毕业设计_课程设计】在线免费小说微信小程序的设计与实现(源码+论文)

文章目录0 项目说明1 系统介绍1.1 业务层面1.2 产品层面1.3 技术层面2 项目运行3 项目截图3.1 小程序3.2 后台管理系统3.3 论文概览4 项目源码0 项目说明 在线免费小说微信小程序的设计与实现 提示:适合用于课程设计或毕业设计,工作量达标,…

word页码如何设置为章节加页码,例如第一章第一页1-1、第二章第一页2-1

由于用到word页码分章节页码的形式,从网上查了一下,质量真的很差,没有一篇文章讲清楚的,有的所答非所问,一怒之下,利用几个小时的时间解决问题并写下这篇文章,以供大家学习参考!&…

如何多台OAK设备同时RTSP推流?

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…

世界杯结束了,但盼盼的“世界杯”才刚刚开始

体育的魅力是什么? 有人说体育的魅力在于感染力,在于惊险时刻带来的心跳反应。也有人说,体育的魅力源自于——体育不止于体育本身。所谓体育,实则更像是一卷不会完卷的英雄史诗,记录着无数运动员的高光时刻也承载着数…

grafana监控oceanbase-obagent部署

1.Install ob-deploy in obd server(obdserver can be a ocp server) (1)download newest version of ob-deploy and obagent,upload them to /soft directory oceanbase-community-stable-el-7-x86_64安装包下载_开源镜像站-阿里云 (2) install obdeploy rpm -ivh ob-deplo…

LinkedHashMap源码解析

LinkedHashMap源码解析 简介 LinkedHashMap 继承于 HashMap,其内部的 Entry 多了两个前驱、后继指针,内部额外维护了一个双向链表,能保证元素按插入的顺序访问,也能以访问顺序访问,可以用来实现 LRU 缓存策略。 Lin…

linux造so及调用

1.so的代码 2.gcc -O -c -fPIC -o testso.o so.c 3.gcc -shared -o testso.so testso.o 4.so可以看到了。 5.拷贝到系统内,然后同时ldconfig更新下。 6.调用的c代码 7.编译,连接。 8.可以看到执行的结果了。 ######################################…

分布式光伏运维平台具体有哪些功能?

安科瑞 华楠 综合看板 1、显示所有光伏电站的数量,装机容量,实时发电功率。 2、累计日、月、年发电量及发电收益。 3、累计社会效益。 4、柱状图展示月发电量 电站状态 1、电站状态展示当前光伏电站发电功率,补贴电价,峰值功…

2022游戏安全行业峰会举办,生态共建护航游戏产业

游戏的外挂、黑产、盗版等问题,一直是运营过程中面临的重要难题。这些安全问题,轻则给游戏的收入和口碑带来损伤,重则可以摧毁一款游戏。因此,近年来越来越多的游戏厂商不断加大对游戏安全的投入,为游戏建造铜墙铁壁。…

说说Vue响应式系统中的Watcher和Dep的关系-面试进阶

引言 在这里我先提出两个问题(文章末尾会进行解答): 在Vue的数据响应系统中,Dep和Watcher各自分担什么任务?Vue的数据响应系统的核心是Object.defineproperty一定是最好的吗?有什么弊端和漏洞吗&#xff…

【毕业设计_课程设计】基于Android的二维码扫描库

文章目录0 项目说明1 实现功能2 使用方式3 项目工程0 项目说明 基于Android的二维码扫描库 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 1 实现功能 可打开默认二维码扫描页面支持对图片Bitmap的扫描功能支持对UI的定制化操作支…

Problem C: 算法9-9~9-12:平衡二叉树的基本操作

Problem Description 平衡二叉树又称AVL树,它是一种具有平衡因子的特殊二叉排序树。平衡二叉树或者是一棵空树,或者是具有以下几条性质的二叉树: 1. 若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值&#xf…

JavaSE笔记——内部类

文章目录前言一、创建内部类二、链接外部类三、使用.this 和.new四、内部类与向上转型五、内部类方法和作用域六、匿名内部类七、嵌套类1. 接口内部的类2. 从多层嵌套类中访问外部类的成员八、继承内部类九、局部内部类总结前言 一个定义在另一个类中的类,叫作内部…

AUTO-CUT安装。

auto cut 是李沐老师分享的视频剪辑工具wisper。 这我非常需要啊。 所以看看怎么安装。 先下载客户端。和ffmpeg 链接:https://pan.baidu.com/s/1EZomUtV8Y_es8crR6-r3GQ 提取码:lgky 解压安装autocut客户端。 还需要ffmpeg和环境。 环境配置是自动…

事业编上岸浙大mpa的个人经验总结

先来介绍下我的个人情况吧,我是2022级浙大MPA项目的一名新生,也是一名中学老师,定居在杭州,毕业于湖州师范学院,在学校主要是负责教研这一块的工作,因为工作需要的原因,在综合了解了几个项目后&…