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

news2025/1/17 8:48:06

里氏替换原则

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-8
        System.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.coloradmin.cn/o/44644.html

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

相关文章

1540_AURIX_TriCore内核架构_FPU

全部学习汇总: GreyZhang/g_tricore_architecture: some learning note about tricore architecture. (github.com) 这一次看一下TriCore的FPU,浮点处理单元。说起来,这算是很多MCU中的一个高级模块了。 1. 在TriCore中FPU其实是可选实现的&a…

动画演示选择排序(Selection Sort)

1、排序规则 1.1 一句话总结选择排序 从数组中第一个数字开始,数组中每个数字都要和后面所有数字比一次大小,每每次循环遍历当前最小值,放在当前循环范围内的最小位置。当完成第 N - 1 次循环之后,排序完成。N 数组长度 - 1。 …

113.(leaflet篇)leaflet根据距离截取线段

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

不同类型的 SSL 证书解释

了解不同类型的 SSL 证书&#xff1a;扩展验证 (EV)、组织验证 (OV) 和域名验证 (DV)。 查看用例及更多。 SSL/TLS 证书用于验证网站的身份并在服务器和浏览器之间创建安全连接。有许多不同类型的 SSL 证书选项可用&#xff0c;它们都有其独特的用例和价值主张。证书颁发机构 …

【项目实战合集】计算机视觉毕业设计项目怎么选,超30个经典案例供你选择...

每年到了搞毕业设计的时候&#xff0c;很多学生朋友都很头疼&#xff0c;指导老师给不了好题目&#xff0c;自己也没有什么好的想法&#xff0c;怕选的太容易了过不了&#xff0c;怕选的太难了做不出&#xff01;今年我们在计算机视觉方向出了【超过30个基于Pytorch框架】的实战…

FineReport 动态图表表格软件-函数计算组成和语法

1. 概述 1.1 版本 1.2 功能简介 在设计模板时用户需要频繁的使用公式函数&#xff0c;例如&#xff1a;求和、求个数、做判断等等。 本文介绍函数的计算组成和语法。 2. 计算语法 2.1 概览 组成部分 语法 示例 函数 函数语法详情查看对应函数&#xff1a; SUM(合同金额…

AGI意识科学每周速递 | 2022年11月第四期

AGI&意识科学每周速递 | 2022年11月第四期 心识研究院 Mindverse Research 2022-11-28 17:00 发表于上海 收录于合集#AGI&意识科学每周速递24个 本周主要内容&#xff1a;程序辅助语言模型 PAL、AI 外交官 CICERO、视觉语言图灵测试、NLP 的持续学习、胎儿的大脑皮层…

winograd卷积实践

winograd卷积基本原理参考 Winograd算法实现卷积原理_Luchang-Li的博客-CSDN博客_optimizing batched winograd convolution on gpus winograd卷积图示&#xff1a; 注意这张图里面隐藏了input和output channel。实际上每个空间维度里面还包含了batch和in/out channel维度。 …

从pom文件里面找不到对应的Maven依赖,通过下面的方法完美解决

如下&#xff0c;我想获取gson对应的依赖 第一步&#xff1a;进入引入对应包的类里面 第二步&#xff1a;进入包&#xff1a;Ctrl 左键 ctrl左键点击gson后&#xff0c;会自动跳转到这个文件夹 第三步&#xff1a;打开依赖图 按箭头点击后&#xff0c;会出现下面的依赖图 …

[附源码]Python计算机毕业设计SSM基于Java的音乐网站(程序+LW)

环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 Maven管理等…

基于java+swing+mysql北方传统民居信息管理系统

基于javaswingmysql北方传统民居信息管理系统一、系统介绍二、功能展示1.用户登陆2.用户界面3.管理员界面4.民居信息修改5.民居信息详情三、系统实现1.ManageMainFrame.java四、其它1.其他系统实现一、系统介绍 用户&#xff1a;民居信息浏览、民居详细信息 管理员&#xff1a…

CDMP证书是什么样?CDMP证书有用吗?

随着数字化经济在我国的迅速开展&#xff0c;企业越来越重视数字人才的培养&#xff0c;致使越来越多得数字人通过考取CDMP证书来证明自己的能力。而一些犹豫观望的人&#xff0c;就会问。拿到CDMP证书&#xff0c;对你们真的有用吗&#xff1f;是纸质版证书还是电子版证书&…

PHP交流管理系统wamp运行定制开发mysql数据库html网页算机软件工程

一、源码特点 PHP交流管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库系统主要采用B/S模式开发,开发环境为PHP APACHE&#xff0c;数据库为mysql5.0 &#xff0c;使用php语言开发 PHP交流管理系统wamp运…

想把iPad作为扩展屏,却发现macOS monterey随航功能不见了

居家办公最不爽的事情就是没有扩展屏&#xff0c;对于开发来说&#xff0c;效率是有影响的&#xff0c;于是便想着把iPad当作扩展屏来用 系统参数 mac&#xff1a; macOS monterey&#xff08;12.4&#xff09;&#xff1b;M1 iPad&#xff1a; iPad Pro 第2代&#xff0c;应该…

分享 2022 年最受欢迎的黑科技工具(一)

Hello, everybody &#xff0c;2022 年最受欢迎的黑科技工具&#xff08;一&#xff09;&#xff0c;收藏一波吧&#xff0c;您的在看、转发、点赞就是对tuonioooo最大的支持&#xff01; 1.Hijacker 项目地址&#xff1a;https://github.com/chrisk44/Hijacker Hijacker是渗透…

Python基础(七):条件语句深入了解

文章目录 条件语句深入了解 一、了解条件语句 二、if 语法 1、语法 2、快速体验 三、实例&#xff08;上网&#xff09; 1、简单版 2、进阶版 四、if...else... 1、语法 2、实用版&#xff1a;网吧上网 五、多重判断 1、语法 2、实例&#xff1a;工龄判断 六、…

Kotlin高仿微信-第6篇-主页-我的

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

【信管2.3】项目生命周期

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

在 Docker 容器内集成 Crontab 定时任务

本文内容Crontab 基础知识Crontab 日志问题参考链接有时候&#xff0c;我们需要在容器内执行某种定时任务。譬如&#xff0c;Kerberos 客户端从 KDC 中获取到的 TGT 默认有效期为 10 个小时&#xff0c;一旦这个票据失效&#xff0c;我们将无法使用单点登录功能。此时&#xff…

谈前端测试的重要性

如果正确完成前端测试&#xff0c;将使我们的用户感到满意&#xff0c;并在使用我们的应用程序时获得良好的性能体验。 根据 Bob 大叔的说法&#xff0c;测试是系统的一部分&#xff1b;许多开发人员认为相反&#xff0c;因为他们没有部署。他宣称这是一个灾难性的观点&#x…