当前位置: 首页 > news >正文

C++ 依赖倒置

  • C++(二十五)依赖倒置
  • 案例

C++(二十五)依赖倒置

依赖倒置原则(Dependency Inversion Principle,简称DIP)是面向对象设计中的一个重要原则,
它由Robert C. Martin(也称为Uncle Bob)提出。
DIP的核心思想是高层模块不应该依赖于低层模块,
二者都应该依赖于抽象;
抽象不应该依赖于细节,细节应该依赖于抽象。

在C++中,依赖倒置原则可以通过以下几个方面来实现:抽象接口:定义抽象接口(通常是纯虚类),高层模块和低层模块都依赖于这个抽象接口。依赖注入:通过构造函数、方法参数或设置器方法将依赖关系注入到类中,而不是在类内部直接创建依赖对象。控制反转:通过使用框架或容器来管理对象的创建和依赖关系,实现控制反转。

案例

#include <iostream>
using namespace std;// 定义一个接口类 IReader,所有阅读器类都需要实现这个接口
class IReader
{
public:// 纯虚函数,表示所有继承自 IReader 的类都必须实现这个函数virtual string getContents() = 0;// 析构函数,释放内存// 虚析构函数,确保派生类对象在删除时能够正确调用析构函数virtual ~IReader() = default;//= default:这是C++11引入的特性,表示使用编译器生成的默认析构函数实现。// 编译器会自动生成一个析构函数,该析构函数会依次调用类成员和基类的析构函数。
};// Book 类继承自 IReader,实现 getContents 方法
class Book : public IReader
{
public:// 实现 getContents 方法,返回书的内容string getContents(){return "从前有座山,山里有座庙,庙里有个小和尚,要听故事";}// 析构函数,释放内存~Book() override {cout << "Book destructor called" << endl;};
};// NewsPaper 类继承自 IReader,实现 getContents 方法
class NewsPaper : public IReader
{
public:// 实现 getContents 方法,返回报纸的内容string getContents(){return "Trump,赢得的下一届美国总统大选";}// 析构函数,释放内存~NewsPaper() override{cout << "NewsPaper destructor called" << endl;};
};// Mother 类,有一个方法 tellStory,接受一个 IReader 指针作为参数
class Mother
{
public:// tellStory 方法,通过 IReader 指针调用 getContents 方法,输出内容void tellStory(IReader *i){cout << i->getContents() << endl;}// 析构函数,释放内存~Mother(){cout << "Mother destructor called" << endl;};
};// 主函数
int main()
{// 创建 Mother 对象Mother m;//m是栈对象,自动释放内存// 创建 Book 对象,并分配内存Book *b = new Book;// 创建 NewsPaper 对象,并分配内存NewsPaper *n = new NewsPaper;// 输出提示信息cout << "Mother start to tell story" << endl;// 调用 tellStory 方法,传入 Book 对象m.tellStory(b);// 输出提示信息cout << "Mother start to tell news" << endl;// 调用 tellStory 方法,传入 NewsPaper 对象m.tellStory(n);// 释放 Book 对象的内存delete b;// 释放 NewsPaper 对象的内存delete n;// 返回 0,表示程序正常结束return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++】STL | string 详解及重要函数的实现
  • 项目中万能使用tailwindcss,无版本冲突、报错
  • 中小微企业必看:税贷票贷融资策略与实战技巧
  • 最新消息:Sedex 供应商会员年费调整
  • Pytest测试报告生成专题
  • 客户三要素和五要素
  • dp+容斥原理,LeetCode 3130. 找出所有稳定的二进制数组 II
  • 【学习总结】MySQL篇
  • 我的API定义规范(未完待续,欢迎指正)
  • 关于缓存的一些心得
  • unity对象缓存技术ObjectPool
  • 【算法】KMP算法
  • 硬盘分区读不出来:原因深度剖析与高效恢复实践
  • 通用分页处理:从繁琐到简洁的转变
  • PYTHON专题-(7)python都有包了?
  • Android组件 - 收藏集 - 掘金
  • AWS实战 - 利用IAM对S3做访问控制
  • Bytom交易说明(账户管理模式)
  • conda常用的命令
  • iOS编译提示和导航提示
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • jQuery(一)
  • js算法-归并排序(merge_sort)
  • js学习笔记
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • VuePress 静态网站生成
  • vue的全局变量和全局拦截请求器
  • 从输入URL到页面加载发生了什么
  • 前端面试之闭包
  • 使用 Docker 部署 Spring Boot项目
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​第20课 在Android Native开发中加入新的C++类
  • ​决定德拉瓦州地区版图的关键历史事件
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (20)docke容器
  • (3)STL算法之搜索
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (笔记)M1使用hombrew安装qemu
  • (论文阅读11/100)Fast R-CNN
  • *2 echo、printf、mkdir命令的应用
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET C# 操作Neo4j图数据库
  • .net 发送邮件
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • .NET大文件上传知识整理
  • .NET序列化 serializable,反序列化
  • .NET中统一的存储过程调用方法(收藏)
  • .so文件(linux系统)
  • @Pointcut 使用
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [012-1].第12节:Mysql的配置文件的使用
  • [2]十道算法题【Java实现】