Java设计模式七大原则-里氏替换原则

news/2024/5/3 8:41:46/文章来源:https://blog.csdn.net/m0_62946761/article/details/128077720

里氏替换原则

OO中的继承性的思考和说明
  1. 继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏。
  2. 继承在给程序设计带来便利的同时,也带来了弊端。比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象间的耦合性,如果一个类被其他的类所继承,则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后,所有涉及到子类的功能都有可能产生故障
  3. 问题提出:在编程中,如何正确的使用继承? => 里氏替换原则

基本介绍

  1. 里氏替换原则(Liskov Substitution Principle)1988年,由麻省理工学院的以为姓里的女士提出的。
  2. 如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。换句话说,所有引用基类的地方必须能透明地使用其子类的对象。
  3. 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法
  4. 里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可以通过聚合,组合,依赖 来解决问题。

例子

B在无意的情况下重写了A类的func1方法,使得调用的时候使用的是自己所写的方法,破坏了原来的功能。

public class Liskov {public static void main(String[] args) {A a = new A();System.out.println("11-3=" + a.func1(11, 3));System.out.println("1-8=" + a.func1(1, 8));System.out.println("-----------------------");B b = new B();System.out.println("11-3=" + b.func1(11, 3)); //本意是想调用11-3,即调用父类的方法System.out.println("1-8=" + b.func1(1, 8));// 同上,求1-8System.out.println("11+3+9=" + b.func2(11, 3));}
}class A {//返回两个数的差public int func1 (int num1, int num2) {return num1 - num2;}
}class B extends A {//返回两个数的差,无意的重写了父类的方法public int func1(int a, int b) {return a + b;}public int func2(int a, int b) {return func1(a, b) + 9;}
}

运行结果

分析

解决方法
  • 我们发现原来运行正常的相减功能发生了错误。原因就是类B无意中重写了父类的方法,造成原有功能出现错误。在实际编程中,我们常常会通过重写父类的方法完成新的功能,这样写起来虽然简单,但整个继承体系的复用性会比较差。特别是运行多态比较频繁的时候
  • 通用的做法是:原来的父类和子类都继承一个更通俗的基类,原有的继承关系去掉,采用依赖,聚合,组合等关系代替。

 例子改进

public class Liskov {public static void main(String[] args) {A a = new A();System.out.println("11-3=" + a.func1(11, 3));System.out.println("1-8=" + a.func1(1, 8));System.out.println("-----------------------");B b = new B();//因此此时B不再继承A类,所以不会再认为func1是求减法的//调用完成的功能会很明确System.out.println("11+3=" + b.func1(11, 3));System.out.println("1+8=" + b.func1(1, 8));System.out.println("11+3+9=" + b.func2(11, 3));//使用组合仍然可以使用A类相关方法System.out.println("11-3="+b.func3(11,3));}
}
//基类
class Base {//把更加基础的方法和成员写到Base类
}
class A extends Base{//返回两个数的差public int func1 (int num1, int num2) {return num1 - num2;}
}class B extends Base {public A a = new A();//返回两个数的差,无意的重写了父类的方法public int func1(int a, int b) {return a + b;}public int func2(int a, int b) {return func1(a, b) + 9;}public int func3(int a, int b) { return this.a.func1(a, b);}
}

运行结果

 

UML类图

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++利器STL——vector详解

要努力,但不要着急,繁花锦簇,硕果累累都需要过程! 目录 1.vector的介绍及使用 1.1vector的介绍 1.2vector的使用 2.vector模拟实现 3.vector常见试题 1.vector的介绍及使用 1.1vector的介绍 1. vector是表示可变大小数组的序列容…

深度学习入门(9)神经网络Affine与Softmax层的计算图表示方式及其误差反向传播的代码实现

《深度学习入门》系列文章目录 深度学习入门 (1)感知机 深度学习入门(2)神经网络 深度学习入门(3)神经网络参数梯度的计算方式 深度学习入门(4)【深度学习实战】无框架实现两层神经网络的搭建与训练过程 深…

【信管2.3】项目生命周期

项目生命周期上一篇文章内容有点多呀,消化完了吗?其实吧,最主要的就是那三种组织形式而已,别的真没什么,记住它们的优缺点和项目经理的权力大小就可以了。今天我们轻松点,虽说还是挺重要的,但要…

java中类加载与双亲委派机制

类加载是什么 把磁盘中的java文件加载到内存中的过程叫做类加载 当我们用java命令运行某个类的main函数启动程序时,首先需要通过类加载器把主类加载到JVM. 有如下 User 类 package dc.dccmmtop; public Class User {public static void main(String[] args) {Sys…

TextBox文本框与PasswordBox密码框水印

在开发一个软件和网页的时候,都会有一个功能,那就是登陆功能,有了登陆那就一定需要用户输入账号和密码,我们在写登陆页面都会想到使用TextBox和PasswordBox去完成这两个功能,但是有一个问题,那就是如果你使…

pycharm opencv无法自动补全

我的环境 python 3.6.9opencv-python 4.4.0.42opencv-contrib-python 4.6.66ubuntu 18.04 LTSpycharm 2020.3.2 解决方案 首先找到cv2的site-packagespip3 show opencv-python进入到该目录, 复制so结尾文件至上级目录: cp cv2.cpython-36m-x86_64-linux-gnu.so ../等待pych…

R语言用ARIMA模型滑动时间窗口识别网络流量时间序列异常值

全文链接:http://tecdat.cn/?p30597最近我们被要求解决时间序列异常检验的问题。有客户在使用大量的时间序列。这些时间序列基本上是每10分钟进行一次的网络测量,其中一些是周期性的(即带宽),而另一些则不是&#xff…

微信开发者工具C盘占用大的问题

将User Data 下的文件迁移到其他盘,比如 D盘,E盘,F盘 步骤如下: 1.找到微信开发者工具C盘所在的缓存目录,一般为 C:\Users\ 你的用户名\AppData\Local\微信开发者工具\User Data 将里面的内容全部剪切到其它盘符&…

使用Psycopg2连接openGauss

文章目录1.简介2.接口介绍开发流程接口说明3.使用3.1环境准备3.2下载并加载python驱动3.3创建数据库连接用户3.4示例4.常见报错1.简介 Psycopg是一种用于执行SQL语句的PythonAPI,可以为PostgreSQL、openGauss数据库提供统一访问接口,应用程序可基于它进…

嘉创房地产冲刺港交所:半年营收4.7亿 现金及现金等价物减少

雷递网 雷建平 11月28日嘉创房地产控股有限公司(简称:“嘉创”)日前递交招股书,准备在港交所上市。半年营收4.73亿嘉创为一家精品住宅物业发展商,主要在大湾区的东莞、惠州及佛山迅速发展的住宅市场(如东莞…

干货 | 数字经济创新创业——如何发展绿色经济

下文整理自清华大学大数据能力提升项目能力提升模块课程“Innovation & Entrepreneurship for Digital Economy”(数字经济创新创业课程)的精彩内容。主讲嘉宾:Kris Singh: CEO at SRII, Palo Alto, CaliforniaVisiting Professor of Tsinghua Unive…

下沉市场投资热度提升 7天酒店打造酒店投资“极致性价比”

近日,7天酒店 “总裁面对面”酒店投资云沙龙活动举办,通过微信、抖音双平台联合直播,多维度探讨酒店行业的“新蓝海”机遇以及下沉市场的投资模式,助力更多投资人把握新的市场红利。 经济型酒店拥抱“新蓝海” 下沉市场投资热度提…

Antd中Table列表行默认包含修改及删除功能的封装

一、前言 ant-design是非常不错、方便的一款前端组件库,而这次用到的ProComponents则是在 Ant Design 上进行了自己的封装,更加易用,与 Ant Design 设计体系一脉相承,无缝对接 antd 项目,样式风格与 antd 一脉相承&am…

SAP 财务月结之 外币评估(TCODE:FAGL_FC_VAL,S4版本用 FAGL_FCV)<转载>

原文链接:https://zhuanlan.zhihu.com/p/367876296 在会计期末,企业往往会有以外币记的余额,如应付账款(国外)、应收账款(国外),或外币存款。而企业出具的财务报表,货币必…

学习笔记11月27日

Infant Brain Deformable Registration Using Global and Local Label-Driven Deep Regression Learning 文章来源:谷歌学术 一、摘要 婴儿大脑磁共振(MR)图像的可变形配准具有挑战性,因为:(1)这些纵向图像存在较大的…

RK3588平台开发系列讲解(USB篇)USB 外设 CONFIG

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 Mass Storage Class CONFIG二、USB Serial Converter CONFIG三、USB HID CONFIG四、USB Net CONFIG五、USB Camera CONFIG六、USB Audio CONFIG七、 USB HUB CONFIG沉淀、分享、成长,让自己和他人都能有所收获!…

Java并发-多线程售票案例

1. 前言 本节内容主要是使用 Java 的使用 Condition 和 Lock 机制对多线程售票案例进行实现。售票案例多数情况下主要关注多线程如何安全的减少库存,也就是剩余的票数,当票数为 0 时,停止减少库存。 2. 售票机制模型 如下图所示&#xff0…

ANR系列之ContentProvider类型原理讲解

前言: 众所周知,ANR一共有四种类型,如下: 1.输入事件类型ANR 2.广播类型ANR 3.ContentProvider类型ANR 4.Service类型ANR 四种类型的超时时间如下所示: 所以ANR系列文章也会分为5篇文章来进行讲解,本…

管理最忌讳用权管人

阅读本文大概需要 1.66 分钟。最近星球在更新一些系列课程,其中有一节课叫「怎样从技术人转型管理者?」应该很适合大多读者,毕竟关注我的读者里,做技术做管理的居多,所以这篇也发这里给大家分享下。程序员做技术的&…

WebView2 通过 PuppeteerSharp 实现爬取 王者 壁纸 (案例版)

王者壁纸自动化获取逻辑分析 其实它的逻辑很简单, 就是王者的官网,打开后,在右下角就看到了皮肤页面部分。 这个时候,点击更多,就会打开全部英雄详情的页面。 这个时候,单点任意一个英雄,就会…