【设计模式】Liskov替换原则

news2024/10/24 23:05:50

文章目录

      • LSP原则的定义
      • 关键点
      • 示例
      • 遵循LSP原则的示例
      • 示例2
      • 结论

Liskov替换原则(Liskov Substitution Principle,简称LSP)是面向对象设计中的五大基本原则之一,由Barbara Liskov在1987年提出。LSP原则的核心思想是: 子类对象必须能够替换掉基类对象,并且程序的行为不会发生变化。换句话说,程序中的任何地方使用基类对象时,都应该能够透明地使用其子类对象,而不影响程序的正确性。

LSP原则的定义

LSP原则可以通过以下方式定义:

如果S是T的一个子类型,那么类型为T的对象可以被类型为S的对象替换,而不会改变程序的任何性质(如正确性、任务完成能力等)。

关键点

  1. 行为一致性:子类应当保持基类的行为一致性,不应改变基类的行为。
  2. 契约(Contract)遵守:子类应当遵守基类的契约(如方法的前置条件、后置条件和不变式)。
  3. 不违反基类的约定:子类不应该违反基类中定义的约定和约束。

示例

以下是一个违反LSP原则的示例:

// 矩形
class Rectangle {
    private int width;
    private int height;

    public void setWidth(int width) {
        this.width = width;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    public int getArea() {
        return width * height;
    }
}
// 正方形
class Square extends Rectangle {
    @Override
    public void setWidth(int width) {
        super.setWidth(width);
        super.setHeight(width); // 违反LSP原则
    }

    @Override
    public void setHeight(int height) {
        super.setHeight(height);
        super.setWidth(height); // 违反LSP原则
    }
}

在上述代码中,Square类继承了Rectangle类,但它违反了LSP原则,因为它改变了Rectangle类的行为。具体来说,Square类在设置宽度和高度时,强制将宽度和高度设置为相同的值,这与Rectangle类的行为不一致。

遵循LSP原则的示例

为了遵循LSP原则,可以将矩形和正方形的共同行为抽象到一个接口或抽象类中,然后分别实现这些行为:

interface Shape {
    int getArea();
}

class Rectangle implements Shape {
    private int width;
    private int height;

    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    @Override
    public int getArea() {
        return width * height;
    }
}

class Square implements Shape {
    private int side;

    public Square(int side) {
        this.side = side;
    }

    public int getSide() {
        return side;
    }

    @Override
    public int getArea() {
        return side * side;
    }
}

在这个示例中,RectangleSquare都实现了Shape接口,并且各自定义了自己的行为。这样,RectangleSquare的行为是独立的,不会互相影响,遵循了LSP原则。

示例2

例如,假设你有一个Bird类,它有一个fly()方法。然后你创建了一个Penguin类继承自Bird,但是企鹅不会飞。在这种情况下,直接使用Penguin来替换Bird可能会导致运行时错误,因为客户代码期望所有Bird都能飞行。这违反了 LSP,因为Penguin不能安全地替换Bird。

解决这个问题的一个方法可能是重新组织你的类层次结构,比如将fly()方法移到一个新的接口Flyable中,只有能飞行的鸟类才实现这个接口。这样,Penguin就不会有fly()方法,从而避免了违反 LSP。

结论

Liskov替换原则是面向对象设计中的一个重要原则,确保子类能够替换基类而不改变程序的行为。遵循LSP原则有助于提高代码的可扩展性、可维护性和可重用性。在设计类继承关系时,务必确保子类不会违反基类的契约和行为约定,从而实现更健壮和灵活的面向对象设计。

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

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

相关文章

教程分享!超简单的低功耗4G模组LCD应用示例!看过来~

低功耗4G模组LCD应用是物联网技术中的一部分知识,在未来的学习和实践中,我们还将接触到更多前沿的技术和理念。让我们一起努力,探索科技的无限可能,为我们的生活带来更多便利与惊喜!希望本文能为您提供一些帮助&#x…

Cisco WLC 9800 - HA SSO with Ether-channel

本文将记录如何配置HA SSO以及Ethernet Channel。 1.拓扑情况 本文的内容基于如下的Topo进行。 2.准备工作 两台WLC的型号必须一样;两台WLC必须使用一样的软件版本;需要准备好使用的IP地址:两个用于WLC的管理地址(WMI&#xff…

串口通讯编程示例之串口编写程序

使用open()函数打开串口设备 首先使用open()函数打开串口设备/dev/ttymxc6,设备使用了O_RDWR | O_NOCTTY | O_NDELAY标志,分别代表以读写方式打开、不让设备成为控制终端且设置非阻塞模式,也就是当无法打开设备时,不会在原地等待&…

【博客节选】Unity角色异常抖动问题排查

本文截取自本人文章 :【Unity实战笔记】第二一 基于状态模式的角色控制——以UnityChan为例 发现出现角色抖动问题 尝试解决方法: 跳跃的loop time不要勾选; 相机aim添加垂直阻尼 还是不行,仔细查看是位移时震颤。 UnityCha…

HCIP-HarmonyOS Application Developer 习题(十三)

(多选)1、在设计应用框架的过程中,我们常用的界面应用框架有哪些? A、启动页 B、详情页 C、列表视图 D、网格视图 答案:ABCD 分析: (多选)2、触摸屏以触控的方式进行输入。它可以支持以下哪些…

OpenIPC开源FPV之Ardupilot配置

OpenIPC开源FPV之Ardupilot配置 1. 源由2. 问题3. 分析3.1 MAVLINK_MSG_ID_RAW_IMU3.2 MAVLINK_MSG_ID_SYS_STATUS3.3 MAVLINK_MSG_ID_BATTERY_STATUS3.4 MAVLINK_MSG_ID_RC_CHANNELS_RAW3.5 MAVLINK_MSG_ID_GPS_RAW_INT3.6 MAVLINK_MSG_ID_VFR_HUD3.7 MAVLINK_MSG_ID_GLOBAL_P…

千万不要小看SD3.5!最强模型全家桶来了!

一、SD3.5 的登场 Stability AI 推出的 SD3.5 引起了广泛关注。它直接开源了三个模型,包括 Large 和 Large Turbo,Medium 将于 29 号发布,并且这三个型号都可以商用。 (一)模型版本介绍 模型版本参数量特点分辨率范围S…

《A complete telomere-to-telomere assembly of the maize genome》方法总结

研究背景 完整的T2T基因组组装一直是基因组研究的长期追求。 研究方法 通过生成高深度覆盖的超长 Oxford Nanopore Technology (ONT) 和 PacBio HiFi 测序数据,报道了玉米的完整基因组组装。 每条染色体均以单一contig的形式完整覆盖。 结果概述 基因组特征&am…

vue3中mitt和pinia的区别和主要用途,是否有可重合的部分?

在 Vue 中,Mitt 和 Pinia 是两个不同的工具,它们的主要用途和功能有所不同,但在某些方面也存在重合的部分。 区别 Mitt: Mitt 是一个简单而强大的事件总线库,用于在组件之间进行事件的发布和订阅。 它提供了一种简洁…

【Linux】实现一个简易的shell命令行

🦄个人主页:修修修也 🎏所属专栏:Linux ⚙️操作环境:Xshell (操作系统:Ubuntu 22.04 server 64bit) 目录 一.项目简介 二.分析项目实现 三.逐步实现项目功能 1.获取命令行 2.解析命令行 3.指令的判断 4.普通命令的执行 四.完整项目代码 结语 一.项目简介…

计算生物学与生物信息学漫谈-1-测序一路走来

最近工作中,反思自己计算生物学基础非常薄弱,然而作为一门非常新兴的交叉学科,涉及计算机、物理、生物、数学等多多学科,国内并没有这样完善的教程,因此想要自己做一个教程,使用费曼学习法学习,…

【亚马逊云】基于 Amazon EKS 搭建开源向量数据库 Milvus

文章目录 一、先决条件1.1 安装AWS CLI ✅1.2 安装 EKS 相关工具✅1.3 创建 Amazon S3 存储桶✅1.4 创建 Amazon MSK 实例✅ 二、创建EKS集群三、创建 ebs-sc StorageClass四、安装 AWS Load Balancer Controller五、部署 Milvus 数据库5.1 添加 Milvus Helm 仓库5.2 配置 S3 作…

Vue2、Element中实现Enter模拟Tab,实现切换下一个框的效果

目录 📃前序 👉开发历程 💻实际代码 📽实现效果图 前序 在几乎所有的浏览器中,都具备通过 Tab 键来切换焦点的功能。然而,有些用户提出了强烈要求,希望能够增加通过 Enter 键…

进程间通信(二)消息队列、共享内存、信号量

文章目录 进程间通信System V IPC概述System V IPC 对象的访问消息队列示例--使用消息队列实现进程间的通信 共享内存示例--使用共享内存实现父子进程间的通信(进程同步)示例--使用进程实现之前的ATM案例(进程互斥) 信号量示例--利…

上传Gitee仓库流程图

推荐一个流程图工具 登录 | ProcessOnProcessOn是一个在线协作绘图平台,为用户提供强大、易用的作图工具!支持在线创作流程图、思维导图、组织结构图、网络拓扑图、BPMN、UML图、UI界面原型设计、iOS界面原型设计等。同时依托于互联网实现了人与人之间的…

大厂常问iOS面试题–Runloop篇

大厂常问iOS面试题–Runloop篇 一.RunLoop概念 RunLoop顾名思义就是可以一直循环(loop)运行(run)的机制。这种机制通常称为“消息循环机制” NSRunLoop和CFRunLoopRef就是实现“消息循环机制”的对象。其实NSRunLoop本质是由CFRunLoopRef封装的,提供了面向对象的AP…

6个RAG进阶优化方案,对应14篇论文案例解析

本文对近几月我了解到的RAG优化策略进行总结, 每个优化策略都有相应的研究论文作为支撑。在01先总结优化方向, 02细化说明相应论文 在介绍RAG优化策略之前, 先说说知识库数据处理: 增强数据粒度:旨在提升文本标准化、一致性、事实准确性和丰富的上下文&#xff0c…

Acrel-1000变电站综合自动化系统及微机在化工企业中的应用方案

文:安科瑞郑桐 摘要:大型化工企业供配电具有的集约型特点,化工企业内35kV变电站和10kV变电所数量大、分布广,对于老的大多大型及中型化工企业而言,其变电站或变电所内高压电气设备为旧式继电保护装置,可靠…

详解Java的类文件结构(.class文件的结构)

this_class 指向常量池中索引为 2 的 CONSTANT_Class_info。super_class 指向常量池中索引为 3 的 CONSTANT_Class_info。由于没有接口,所以 interfaces 的信息为空。 对应 class 文件中的位置如下图所示。 06、字段表 一个类中定义的字段会被存储在字段表&#x…

zotero文献管理学习

1 zotero软件简介 zotero是一款开源的文献管理软件。如果你听说或使用过EndNote,那么可能会对“文献管理”有一定的概念。可以简单地这样理解:zotero一定程度上可以作为EndNote的平替。 EndNote需要注册付费,对于无专业科研机构隶属关系的企…