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

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对象则允许你在运行时填入多种不同的具体类型

        

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或方法的具体类型

        

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • “轻、灵、画、韵”,TCL第三代艺术电视引领艺术生活
  • 面向对象练习题
  • 玄机-第二章日志分析-mysql应急响应
  • LeetCode题(66,69,35,88)--《c++》
  • Ubuntu编译ffmpeg并添加cmake工程
  • 园区AR导航系统构建详解:从三维地图构建到AR融合导航的实现
  • JAVA面试题---JVM
  • JAVA零基础小白自学日志——第十九天
  • 【音视频】AAC编码器与ffmpeg生成AAC数据
  • 机器学习·概率论基础
  • conda:导出与创建环境快照
  • Github 2024-07-20 开源项目日报Top10
  • Jupyter Notebook与机器学习:使用Scikit-Learn构建模型
  • 【开源库学习】libodb库学习(一)
  • sourcetree中常用功能使用方法及gitlab冲突解决
  • JavaScript-如何实现克隆(clone)函数
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【技术性】Search知识
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • gcc介绍及安装
  • GitUp, 你不可错过的秀外慧中的git工具
  • HTTP那些事
  • Javascript弹出层-初探
  • Java基本数据类型之Number
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • react 代码优化(一) ——事件处理
  • 编写高质量JavaScript代码之并发
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 排序算法之--选择排序
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 软件开发学习的5大技巧,你知道吗?
  • 手写双向链表LinkedList的几个常用功能
  • 我的zsh配置, 2019最新方案
  • 以太坊客户端Geth命令参数详解
  • 阿里云ACE认证学习知识点梳理
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​香农与信息论三大定律
  • # 达梦数据库知识点
  • #100天计划# 2013年9月29日
  • #if 1...#endif
  • #pragma预处理命令
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (27)4.8 习题课
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (js)循环条件满足时终止循环
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (windows2012共享文件夹和防火墙设置
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (五)Python 垃圾回收机制
  • (一) 初入MySQL 【认识和部署】
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .apk文件,IIS不支持下载解决
  • .NET 5种线程安全集合