Rust编程-类面向对象编程

封装(encapsulation):

rust使用pub关键字来控制代码中哪些模块、类型、函数和方法是公开的,默认都是私有的

继承(inheritance):

rust里没有继承。

rust通过定义trait来实现代码共享。trait中也可以默认实现,具体实现时,可以覆盖trait中的默认实现。

多态(polymorphism):

在rust中可以使用泛型来构建不同类型的抽象,并使用trait约束来限制泛型,从而实现多态

trait对象来存储不同类型的值

trait对象被专门用于抽象某些共有行为

trait对象能够指向实现了指定trait的类型实例

创建trait对象:通过选用一种指针,例如&引用或Box<T>智能指针等,并添加dyn关键字与指定相关trait来创建trait对象

trait对象可以被用在泛型或具体类型所处的位置。

Rust类型系统都会在编译时确保出现在相应位置上的值实现trait对象指定的trait

trait对象VS泛型:

泛型参数一次只能被替代为一个具体的类型,而trait对象则允许你在运行时填入多种不同的具体类型

rust 复制代码
pub struct Screen {
    pub components: Vec<Box<dyn Draw>>,
}

这一概念与动态类型语言中的"鸭子类型"(ducktyping)十分相似:如果某个东西走起来像鸭子,叫起来也像鸭子,那么它就是一只鸭子!

动态数组components时指定Box<dyn Draw>元素类型,Screen实例只会接收那些能够调用draw方法的值。

trait对象会执行动态派发

静态派发(static dispatch):

在泛型使用trait约束时执行单态化,编译器会为每一个具体类型生成对应泛型函数和泛型方法的非泛型实现,并使用这些具体的类型来替换泛型参数

动态派发(dynamic dispatch):

动态派发下的编译器无法在编译过程中确定你调用的究竟是哪一个方法。Rust必然会在我们使用trait对象时执行动态派发。因为编译器无法知晓所有能够用于trait对象的具体类型,所以它无法在编译时确定需要调用哪个类型的哪个具体方法。

trait对象必须保证对象安全

Rust采用了一套较为复杂的规则来决定某个trait是否对象安全:

方法的返回类型不是Self。

方法中不包含任何泛型参数。

关键字Self是一个别名,它指向了实现当前trait或方法的具体类型

相关推荐
2501_941875281 小时前
从配置中心到动态管理的互联网工程语法演进与多语言实践分享
开发语言·python
hfywmsj2 小时前
广州餐饮铺位招租决策模型:多因子选址系统设计
开发语言·人工智能·python·广州餐饮铺位招租
vx-Biye_Design2 小时前
SSM伴侣动物伴护星小程序06330-计算机课程设计、毕业设计
spring boot·后端·elasticsearch·小程序·架构·课程设计·idea
努力的lpp4 小时前
php反序列化一(大白话版)
开发语言·web安全·php·ctf·反序列化
2分钟速写快排4 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
菜鸟~noob2334 小时前
【电子战】第03篇:CFAR(恒虚警)处理【含matlab代码】
开发语言·matlab
面向Google编程4 小时前
Apache Iceberg Variant 类型:v3 半结构化数据不再「二选一」
大数据·后端
jason成都5 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
泡海椒5 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb5 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析