面向对象设计原则(SOLID原则)C++

面向对象设计原则(SOLID原则),每个原则都有其独特的重要性和应用场景。以下是详细解释,并给出简单的示例:

1. 单一职责原则(Single Responsibility Principle, SRP)

  • 原则概述:一个类应该只有一个引起它变化的原因。换句话说,一个类应该只负责一组相关的功能,而不是杂糅多种不相关的功能。
  • 例子:考虑一个图书馆管理系统,一个Book类应该专注于表示书籍的属性和行为(如书名、作者、ISBN等),而不应该包含借书、还书等操作。这些操作可以由一个Library类或者BookManager类负责。

2.开闭原则(Open/Closed Principle, OCP)

  • 原则概述:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。这意味着可以通过扩展现有类的行为来实现新功能,而无需修改现有类的源代码。
  • 例子:考虑一个图形绘制软件,有一个基类Shape,派生类有CircleRectangle。如果需要添加新的图形,如Triangle,应该创建一个新的派生类,而不是修改现有的Shape类。

3.里氏替换原则(Liskov Substitution Principle, LSP)

  • 原则概述:子类必须能够替换掉它们的父类,并且程序仍然保持正确性。也就是说,子类应该能够完全替代父类并执行父类的功能。
  • 例子:如果有一个Bird类,它有一个fly()方法,那么派生类如SparrowPenguin应该能够实现fly()方法。即使企鹅不能飞行,但它仍然应该实现fly()方法并按照约定返回适当的值或者抛出适当的异常。

4.接口隔离原则(Interface Segregation Principle, ISP)

  • 原则概述:不应该强迫客户端依赖于它们不用的接口。接口应该精确地说明客户端所需的行为,而不强迫客户端实现不需要的方法。
  • 例子:考虑一个电子邮件应用程序,有一个Email接口,定义了sendEmail()receiveEmail()方法。如果有一个Notification类只需要sendEmail()方法,而不需要receiveEmail(),那么应该创建一个仅包含sendEmail()方法的EmailSender接口,而不是将不需要的方法强加给Notification类。

5.依赖倒置原则(Dependency Inversion Principle, DIP)

  • 原则概述:高层模块不应该依赖于低层模块,二者都应该依赖于抽象。抽象不应该依赖于具体实现,而具体实现应该依赖于抽象。
  • 例子:假设有一个DataManager类需要从数据库中检索数据,它不应该直接依赖于具体的数据库引擎(如MySQL或PostgreSQL)。相反,应该定义一个抽象的Database接口,MySQLDatabasePostgreSQLDatabase类实现这个接口。然后DataManager类依赖于Database接口,而不是具体的数据库实现。

这些原则可以帮助你在写代码时,设计出更加灵活、可维护和可扩展的C++类和系统架构。

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

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

相关文章

Android应用开发从入门到竞赛(1)——开篇

本人从事Android应用开发十余年,指导大学生竞赛十余载,多次指导竞赛任务的Android应用开发,开设本专栏,介绍如何快速入门Android应用开发并将其应用于各类竞赛,同时顺带聊聊比赛感想。(部分内容来自本人所编…

树莓派4设置

使用sudo命令时要求输入密码 以 sudo 为前缀的命令以超级用户身份运行。默认情况下,超级用户不需要密码。不过,您可以要求所有以 sudo 运行的命令都输入密码,从而提高 Raspberry Pi 的安全性。 要强制 sudo 要求输入密码,请为你…

Nuxt3 [Vue warn]: Hydration node mismatch:【解决方案】

[Vue warn]: Hydration node mismatch: 水合节点不匹配 Server rendered element contains more child nodes than client vdom. 服务器呈现的元素包含的子节点多于客户端vdom。 这个问题解决起来也很好解决,看这个问题是怎么出来的,看代码:…

DiskLRUCache

DiskLRUCache是Android中实现磁盘缓存相关的组件类,当缓存满时其使用最近最少使用策略来淘汰相关的元素,以控制缓存大小。本文主要基于DiskLRUCache相关源码分析DiskLRUCache的创建、缓存的添加、获取、删除流程。 DiskLRUCache创建 DiskLRUCache不允许…

暗影精灵8Pro声音没有了,这个方法可以解决,亲测有效!

这个OMEN by HP Gaming Laptop 16-k0xxx Windows 10 Sound Driver Mod ,真的解决了我的大问题! 如果你的暗影精灵8 Pro酷睿版突然变得哑巴了,扬声器和麦克风都发不出声音,那可能是声卡驱动出了问题。 别担心,我也是个…

代码随想录算法训练营DAY46|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

121. 买卖股票的最佳时机 题目链接:121. 买卖股票的最佳时机 class Solution(object):def maxProfit(self, prices):""":type prices: List[int]:rtype: int"""if len(prices) 0:return 0dp [[0]*2 for i in range(len(prices))]…

eNSP中三层交换机的配置和使用

一、拓扑图 1.新建拓扑图 2.PC端配置 PC1: PC2&#xff1a; 二、基本命令配置 1.S1配置 <Huawei>system-view [Huawei]sysname S1 [S1]vlan 10 //在交换机 S1 上创建 VLAN 10 [S1-vlan10]vlan 20 // 在交换机 S1 上创建 VLAN 20 [S1-vlan20]quit //退出 VLAN 配置…

舆论中心的《黑神话:悟空》:人们总希望,这只猴子能打破些什么

距离《黑神话&#xff1a;悟空》上线还有60天。外界关于游戏的争议有很多&#xff0c;但游戏科学却很少出来回应什么。 6月9日&#xff0c;博主兲虎发文称&#xff0c;《黑神话&#xff1a;悟空》之所以在发布宣传视频后&#xff0c;一直遭受到所谓性别歧视的攻击与污蔑&#…

短视频营销系统小程序源码

开启全新营销时代 &#x1f3a5;一、引言&#xff1a;短视频营销微信小程序&#xff0c;营销新风尚 在数字化时代&#xff0c;短视频以其直观、生动的特点迅速崛起&#xff0c;成为用户获取信息、娱乐消遣的重要渠道。而短视频营销微信小程序则是将短视频与微信营销完美结合&…

力扣(2024.06.25)

1. 76——最小覆盖子串 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 t 中重复字符&#xff0c;我们寻找的子字符串中该字符数量必须不…

【Unity】数据持久化--二进制 ,文件操作

1、各字节类型转字节数组 1.1 不同变量类型 有符号 sbyte int short long无符号 byte uint ushort ulong浮点 float double decimal特殊 bool char string 1.2 变量的本质 变量的本质是2进制在内存中都以字节的形式存储着1byte 8bit1bit(位)不是0就是1 //通过sizeof方法可…

解决node: bad option: -V

出现这个问题是由于我们的不当操作造成的&#xff0c;v是需要小写的&#xff0c;看下图 node --version node -v

P2P文件传输协议之BitTorrent协议

P2P文件传输协议中的BitTorrent协议是一种用于高效地下载和上传大型文件的点对点&#xff08;P2P&#xff09;传输协议。以下是关于BitTorrent协议的详细说明&#xff1a; 一、技术原理 分布式系统&#xff1a;BitTorrent是一个分布式系统&#xff0c;没有中央服务器。相反&a…

缓存双写一致性(笔记)

缓存更新方案 旁路缓存模式 这是比较多的 旁路缓存模式&#xff1a;缓存有就返回&#xff0c;没有数据库查询&#xff0c;放入缓存返回。 还有些常用缓存策略 读穿透模式 读穿透和旁路很相似&#xff0c;程序不需要关注从哪里读取数据&#xff0c;它只需要从缓存查询数据。…

MySQL中什么是索引合并?

索引合并是数据库查询优化的一种技术&#xff0c;它允许数据库管理系统在处理查询时&#xff0c;利用多个索引来改进数据检索的效率。这种技术主要应用在那些设计多个条件的查询中&#xff0c;通过合并多个索引的结果集&#xff0c;找出最终满足所有条件的数据行。 在MySQL中如…

ts 中定义多个数据

let a :{name:string,[xx:string]:any} a {name:小明,age:28,gender:男} 正确 a {name:111,age:28,gender:男} 错误&#xff0c;name必须是字符串 //这句话的意思就是a对象中 name是必填的并且只能是字符串&#xff0c;后面属性名是字符串&#xf…

从概念到现实:数字孪生技术在智慧充电站的实践

在电动汽车蓬勃发展的今天&#xff0c;充电基础设施的智能化升级成为了推动新能源汽车产业跃进的关键一环。数字孪生技术&#xff0c;作为智能制造和工业4.0的核心&#xff0c;正在逐渐渗透到智慧充电站的每一个角落——从提高能源效率到增强用户体验&#xff0c;为智慧充电站的…

vuex数据持久化

清空原因&#xff1a; 刷新页面vuex的数据会丢失属于正常现象&#xff0c;因为JS的数据都是保存在浏览器的堆栈内存里面的&#xff0c;刷新浏览器页面&#xff0c;以前堆栈申请的内存被释放&#xff0c;这就是浏览器的运行机制&#xff0c;那么堆栈里的数据自然就清空了。 解…

【快慢指针】个人练习-Leetcode-142. Linked List Cycle II

题目链接&#xff1a;https://leetcode.cn/problems/linked-list-cycle-ii/description/ 题目大意&#xff1a;给一个链表的头部&#xff0c;判断链表是否有环&#xff0c;如果有&#xff0c;返回环的第一个指针&#xff1b;如果没有&#xff0c;返回nullptr 思路&#xff1a…

强化学习-RLHF-PPO入门

一、定义 强化学习微调分类RM模型 数据集格式训练流程Reward 模型训练流程(分类模型&#xff0c;积极为1&#xff0c;消极为0) AutoModelForSequenceClassificationReward 模型训练案例PPO模型训练流程PPO模型训练案例 二、实现 强化学习微调分类 RLHF:基于人类反馈对语言模型…