56_面向对象语言特性

1. rust是面向对象语言吗?

Rust在设计的时候受到各种编程范式的影响,包括面向对象。

面向对象通常包含以下特性:命名对象、封装、继承。

我们所说的对象包含数据和行为,"设计模式四人帮"在《设计模式》中给出面向对象的定义如下:

  • 面向对象的程序由对象组成
  • 对象包装了数据和操作这些数据的过程,这些过程通常被称为方法或操作

基于以上定义,rust是面向对象的

  • struct、enum包含数据
  • impl块为之提供了方法
  • 但在rust里,带有方法的struct、enum并没有被称为对象

2. 封装

封装指的是:调用对象外部的代码无法直接访问对象内部的实现细节,唯一可以与对象进行交互的方法就是通过它公开的API。

在rust里我们使用pub关键字来决定哪些函数或方法是公开的,而默认情况下都是私有的。

看一个案例:

rust 复制代码
pub struct AveragedCollection {
    list: Vec<i32>,
    average: f64,
}

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;
    }
}

AveragedCollection结构体的list和average是私有的,需要提供对外的修改方法。

  • list提供新增和删除
    • add
    • remove
  • average提供访问和更新
    • average
    • update_average

这就实现了所说的封装。

3. 继承

继承指的是:使对象可以沿用另外一个对象的数据和行为,且无需重复定义相关代码。

  • rust没有继承,

  • 使用继承的其中一个原因:

    • 通常是希望代码能够复用。

    但在rust里我们使用默认的trait方法来实现代码的共享。因为在trait中,如果某个方法有默认实现(即默认的trait方法),那么任何实现了这个trait的类型就会自动拥有这个方法。此外,在实现trait的时候,选择覆盖trait里方法的默认实现,这就是面向对象中的子类覆盖父类方法类似。

    • 使用继承的另一个原因是使用多态。

    多态是同一个行为具有多个不同表现形式或形态的能力,多态就是同一个接口,使用不同的实例而执行不同操作。换句话说就是如果一些对象拥有共同的特征,那么这个对象就可以在运行时相互替换。在rust中我们可以使用泛型来构建不同类型的抽象,并使用trait约束来决定类型必须提供的某些具体特性,这个技术有时候可以叫做限定参数多态化(bounded parametric)。

不过,现在很多编程语言都不使用继承作为内置的程序设计方案了。

相关推荐
鬼手点金5 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
蛋蛋的就会顺顺的6 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
程序员Sunday6 小时前
TypeScript 的 any、unknown、never 有什么区别?
前端·面试·typescript
朱涛的自习室6 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
码艺-Alimjan7 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js
小马不起床7 小时前
零基础玩转 FastAPI_11:前端后台管理页面
前端·状态模式·fastapi
子非鱼a8 小时前
【文件上传】一个普普通通的edu16
前端
美狐美颜SDK开放平台8 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
pride.li9 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
屏什么录9 小时前
电脑如何录屏幕视频和声音?从工具到代码,7 种方案帮你彻底搞定
前端·音视频开发