【Rust】——【面向对象语言的特征】

💻博主现有专栏:

                C51单片机(STC89C516),c语言,c++,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux,基于HTML5的网页设计及应用,Rust(官方文档重点总结),jQuery,前端vue.js,Javaweb开发,Python机器学习等
🥏主页链接:

                Y小夜-CSDN博客

目录

🎯对象包含数据和行为

🎯封装隐藏了实现细节

🎯继承,作为系统与代码共享


        关于一个语言被称为面向对象所需的功能,在编程社区内并未达成一致意见。Rust 被很多不同的编程范式影响,包括面向对象编程;比如第十三章提到了来自函数式编程的特性。面向对象编程语言所共享的一些特性往往是对象、封装和继承。让我们看一下这每一个概念的含义以及 Rust 是否支持它们。

🎯对象包含数据和行为

它这样定义面向对象编程:

        在这个定义下,Rust 是面向对象的:结构体和枚举包含数据而 impl 块提供了在结构体和枚举之上的方法。虽然带有方法的结构体和枚举并不被 称为 对象,但是它们提供了与对象相同的功能,参考 The Gang of Four 中对象的定义。

🎯封装隐藏了实现细节

        另一个通常与面向对象编程相关的方面是 封装encapsulation)的思想:对象的实现细节不能被使用对象的代码获取到。所以唯一与对象交互的方式是通过对象提供的公有 API;使用对象的代码无法深入到对象内部并直接改变数据或者行为。封装使得改变和重构对象的内部时无需改变使用对象的代码。

        结构体也可以有一个字段,该字段保存了 vector 中所有值的平均值。这样,希望知道结构体中的 vector 的平均值的人可以随时获取它,而无需自己计算。换句话说,AveragedCollection 会为我们缓存平均值结果。

pub struct AveragedCollection {list: Vec<i32>,average: f64,
}

        注意,结构体自身被标记为 pub,这样其他代码就可以使用这个结构体,但是在结构体内部的字段仍然是私有的。这是非常重要的,因为我们希望保证变量被增加到列表或者被从列表删除时,也会同时更新平均值。

impl AveragedCollection {pub fn add(&mut self, value: i32) {self.list.push(value);self.update_average();}pub fn remove(&mut self) -> Option<i32> {let result = self.list.pop();match result {Some(value) => {self.update_average();Some(value)}None => None,}}pub fn average(&self) -> f64 {self.average}fn update_average(&mut self) {let total: i32 = self.list.iter().sum();self.average = total as f64 / self.list.len() as f64;}
}

        公有方法 addremove 和 average 是修改 AveragedCollection 实例的唯一方式。当使用 add 方法把一个元素加入到 list 或者使用 remove 方法来删除时,这些方法的实现同时会调用私有的 update_average 方法来更新 average 字段。

  list 和 average 是私有的,所以没有其他方式来使得外部的代码直接向 list 增加或者删除元素,否则 list 改变时可能会导致 average 字段不同步。average 方法返回 average 字段的值,这使得外部的代码只能读取 average 而不能修改它。

        因为我们已经封装好了 AveragedCollection 的实现细节,将来可以轻松改变类似数据结构这些方面的内容。例如,可以使用 HashSet<i32> 代替 Vec<i32> 作为 list 字段的类型。只要 addremove 和 average 公有函数的签名保持不变,使用 AveragedCollection 的代码就无需改变。相反如果使得 list 为公有,就未必都会如此了: HashSet<i32> 和 Vec<i32> 使用不同的方法增加或移除项,所以如果要想直接修改 list 的话,外部的代码可能不得不做出修改。

🎯继承,作为系统与代码共享

        继承Inheritance)是一个很多编程语言都提供的机制,一个对象可以定义为继承另一个对象定义中的元素,这使其可以获得父对象的数据和行为,而无需重新定义。

        如果一个语言必须有继承才能被称为面向对象语言的话,那么 Rust 就不是面向对象的。因为没有宏则无法定义一个结构体继承父结构体的成员和方法。

        然而,如果你过去常常在你的编程工具箱使用继承,根据你最初考虑继承的原因,Rust 也提供了其他的解决方案。

        选择继承有两个主要的原因。第一个是为了重用代码:一旦为一个类型实现了特定行为,继承可以对一个不同的类型重用这个实现。Rust 代码中可以使用默认 trait 方法实现来进行有限的共享,在示例 10-14 中我们见过在 Summary trait 上增加的 summarize 方法的默认实现。任何实现了 Summary trait 的类型都可以使用 summarize 方法而无须进一步实现。这类似于父类有一个方法的实现,而通过继承子类也拥有这个方法的实现。当实现 Summary trait 时也可以选择覆盖 summarize 的默认实现,这类似于子类覆盖从父类继承的方法实现。

        第二个使用继承的原因与类型系统有关:表现为子类型可以用于父类型被使用的地方。这也被称为 多态polymorphism),这意味着如果多种对象共享特定的属性,则可以相互替代使用。

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

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

相关文章

zookeeper集群安装

首先要关闭防火墙&#xff0c;修改配置文件 关闭防火墙命令&#xff1a;systemctl stop firewalld.service 解压到usr/local下&#xff1a;tar -zxvf apache-zookeeper-3.8.4-bin.tar.gz -C /usr/local/ 重命名&#xff1a;mv apache-zookeeper-3.8.4-bin.tar.gz zookeeper …

白银票据~

一. 白银票据的原理 白银票据就伪造ST票据&#xff0c; kerberoasting是破解ST票据中的服务用户hash值&#xff0c;有以下区别&#xff1a; 白银票据&#xff1a;伪造的ST使用的是机器用户的Hash值 Kerberoasting:破解的是ST的域用户的hash值二. 白银票据的利用条件 1.域名 …

操作失败——后端

控制台观察&#xff0c;页面发送的保存菜品的请求 返回的response显示&#xff1a; ---------- 我开始查看明明感觉都挺正常&#xff0c;没啥错误&#xff0c;就是查不出来。结果后面电脑关机重启后&#xff0c;隔一天看&#xff0c;就突然可以了。我觉着可能是浏览器的缓存没…

建筑设计资质等级升级需要满足什么条件?

原有资质要求&#xff1a;企业必须已持有较低级别的设计资质&#xff0c;并在该资质等级范围内从事设计业务至少三年。 技术与管理团队&#xff1a;必须具备与申请资质等级相适应的技术人员&#xff0c;包括一定数量的注册建筑师、工程师和其他专业技术人员。 需要具有经验丰…

如何设计一个数据埋点的完美技术方案?

数据上报 基础原理:通过ajax往后台上报数据&#xff0c;后台根据每一段时间的数据&#xff0c;做报表统计 需要考虑的因素: 1.不要影响到正常接口&#xff0c;可以放后台执行&#xff0c;防止阻塞主线程(settimeout),异步(webwork) 2.可以通过window.requestIdleCallback在…

安全区域边界

文章目录 安全区域边界边界防护跨边界流量通过受控接口通信非法内联非法外联限制无线网络 访问控制启用基于白名单的访问控制策略优化访问控制表根据五元组控制根据会话状态控制根据应用协议和内容控制 入侵防范外部发起的攻击内部发起的攻击对新型攻击防范及时检测攻击行为 恶…

git -- 清除本地分支以及删除远程分支

清除本地分支 1. 列出所有分支:你可以列出所有分支来确认你想要删除的分支名。 git branch -a 2. 删除本地分支: 删除已经合并的分支:git branch -d 分支名 -d 参数用于删除已经被合并到当前分支的分支。 强制删除未合并的分支:git branch -D 分支名 -D 参数用于强制删除…

【学习】DCMM认证提升企业竞争优势的表现

DCMM认证是企业提升数据管理能力的重要途径。它不仅可以帮助企业评估自身的数据管理水平&#xff0c;还可以为企业提供改进的方向和目标。在数字化时代&#xff0c;拥有强大的数据管理能力是企业成功的关键。因此&#xff0c;通过DCMM认证&#xff0c;企业可以更好地适应数字化…

ruoyi-nbcio基于jeecg的flowable前端支持自定义表单组件的自动获取方法

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

金监总局:加快出台机构涉刑案件管理办法 建立风险导向的稽查体系

1. "金融监管新策略&#xff1a;外科手术式处理重大风险" 2. "重拳出击&#xff1a;金监总局的新计划防范金融风险" 3. "金融稽查聚焦&#xff1a;打击侵害行业利益的行为" 4. "保护金融稳定&#xff1a;2024年金融监管新动向" 5. &qu…

5 种技术,可用于系统中的大数据模型,而不会使系统崩塌

文章目录 一、说明二、第一种&#xff1a;批量大小三、第二种&#xff1a;主动学习四、第三种&#xff1a;增加代币数量五、第四种&#xff1a; 稀疏激活六、第五种&#xff1a;过滤器和更简单的模型后记 一、说明 以下是本文重要观点的摘要。阅读它以获取更多详细信息/获取原…

《深入浅出存储引擎》不同数据库背后的数据存储方案

在大数据和AI时代&#xff0c;数据库成为各类应用不可或缺的重要组成部分。而数据库中的数据依赖存储引擎进行管理&#xff0c;包括数据的存储、查询、更新和删除等。因此&#xff0c;在设计系统时&#xff0c;选择正确的数据库存储引擎方案变得尤为重要。这篇文章将以关系型、…

会计电子档案系统方案

会计电子档案系统方案是指建立一个以电子方式存储和管理会计档案的系统。该方案具体包括以下几个方面&#xff1a; 1. 系统架构设计&#xff1a;确定系统的组成以及各个组件之间的关联和交互方式。包括数据库设计、系统服务器和客户端的部署等。 2. 电子档案管理&#xff1a;建…

一切模型皆可联邦化:高斯朴素贝叶斯代码示例

联邦学习是一种分布式的机器学习方法&#xff0c;其中多个客户端在一个中央服务器的协调下合作训练模型&#xff0c;但不共享他们的本地数据。一般情况下我们对联邦学习的理解都是大模型和深度学习模型才可以进行联邦学习&#xff0c;其实基本上只要包含参数的机器学习方法都可…

C# 实时声音频率图绘制

C# 实时声音频率图绘制 采集PCM音频数据 音频原来自麦克风 音频源来自录音文件 处理PCM音频数据 使用 FftSharp.FFT 将PCM数据进行傅里叶变换 安装FftSharp框架 在Nuget包管理器中搜索FftSharp并安装 傅里叶变换 将采集到的PCM数据进行傅里叶变换 // 傅里叶变换System.…

新手如何正确使用代理IP,一篇文章学会,包含实战案例

前言 一、代理IP1.1 什么是代理IP&#xff1f;1.2 代理ip分类1.3 代理IP的作用和优势 二、更换代理IP的方法2.1 重启路由器或光猫2.2 用拨号 vps 重拨更换动态IP代理。2.3 使用浏览器更换IP 三、IPIDEA代理的优势四、提取代理IP4.1 提取步骤4.2 浏览器使用代理IP 五、使用代理I…

Python实现连连看5

3 游戏初始化 当点击图5显示的菜单项“新游戏->开始游戏”后&#xff0c;游戏会显示图2所示的界面&#xff0c;开始游戏。 以上游戏初始化的过程可分为导入图片、生成图片地图以及根据地图显示图片三个步骤。 3.1 导入图片 图2所示的图片资源保存在“\res\pics”文件夹中…

NGINX 部署项目时,遇到刷新页面导致 404

步骤一:准备项目 首先,确保你的项目已经构建完毕,并且所有静态文件(如 index.html, js, css 文件等)都位于一个目录下,例如 /path/to/your/project。 步骤二:编辑 NGINX 配置文件 打开 NGINX 配置文件 你需要打开 NGINX 的配置文件。通常,这个文件位于 /etc/nginx/ngin…

CSS(盒子模型,定位,浮动,扩展)

CSS 盒子模型&#xff1a;外边距&#xff1a;内边距&#xff1a;水平居中&#xff1a; 定位&#xff1a;相对定位&#xff1a;绝对定位&#xff1a;固定定位&#xff1a; 浮动&#xff1a;扩展&#xff1a; 盒子模型&#xff1a; 盒子模型(Box Model) 规定了元素框处理元素内容…

Java核心: 使用instrumentation

在上一篇Java核心: 注解处理器我们提到&#xff0c;通过实现AbstractProcessor&#xff0c;并调用javac -processor能够生成代码来实现特殊逻辑。不过它存在两个明显的问题: 只能新增源文件来扩展逻辑&#xff0c;无法修改现有的类或方法必须有一个单独的编译过程&#xff0c;…