rust学习十八.1、RUST的OOP和简单示例

news/2025/4/19 3:29:40/文章来源:https://www.cnblogs.com/lzfhope/p/18717955

很可惜,出于一些理由,rust抛弃了OOP的核心特性之一:继承

其中一个理由应该是至关重要的,但是解释的比较模糊:继承增加了复杂性

 

的确,继承会让rust编译器变得更加复杂。rust编译器虽然足够体贴,但是它偏慢的编译速度也是很多人所吐槽的。

在我对rust编译了解更多之前,我对这个理由无法给出更加详细的描述,不过我能够理解。 说实话,编写这样的编译器已经足够复杂,如果还要

考虑到继承,大概这种复杂度会让编译器开发者崩溃。

至于其它的理由,例如认为组合足够好用,我觉得有些牵强了!

 

总之,rust对oop的支持主要体现在封装和多态。

 

而所谓的封装,在rust中主要体现在类似java对象的类型:struct,enum中,尤其是struct。

在rust中,struct的地位类似于java的Object。

 

所谓的多态,主要体现在特质(trait),这个时候的特质就类似于java,c++的接口(interface)

只不过,rust的这个特质是java的接口的阉割版本。

rust的特质作为接口存在的时候,只有以下两个功能:

  1. 没有实现的方法定义
  2. 具有默认实现的方法,类似java接口的默认函数.但是后者的默认函数,有静态,私有,默认私有等四种,这是因为前者没有继承的缘故

 

闲言少叙,总之rust对oop的支持大概就是这样了。

一、简单示例

animals.rs

pub mod animals{pub trait Animal{fn eat(&self,food:&String);fn run(&self);fn sleep(&mut self);fn is_wakeup(&self)->bool;fn wakeup(&mut self);}pub struct Dog{name:String,state:bool}impl Dog{pub fn new(name:String)->Self{Dog{name,state:true}} }impl Animal for Dog{fn eat(&self,food:&String){if !self.is_wakeup(){println!("{} 正在睡觉...请不要打扰我,等醒了再吃",self.name);return;}if  food=="骨头"{println!("{} 正在吃{}",self.name,food); }else{println!("{} 不吃{}",self.name,food); }}fn run(&self){if !self.is_wakeup(){println!("{} 正在睡觉...请不要打扰我,等醒了再跑",self.name);return;}println!("{} is running",self.name);}fn sleep(&mut self){println!("{} is sleeping",self.name);self.state=false;}fn is_wakeup(&self)->bool{self.state}fn wakeup(&mut self){println!("{} 起来!",self.name);   self.state=true;}}pub struct Cat{name:String,state:bool}impl Cat{pub fn new(name:String)->Self{Cat{name,state:true}} }impl Animal for Cat{fn eat(&self,food:&String){if !self.is_wakeup(){println!("{} 正在睡觉...",self.name);return;}if food==""{println!("{} 正在吃{}",self.name,food);}else{println!("{} 不吃{}",self.name,food);}}fn run(&self){if !self.is_wakeup(){println!("{} 正在睡觉...请不要打扰我,等醒了再跑",self.name);return;}println!("{} is running",self.name);}fn sleep(&mut self){println!("{} is sleeping",self.name);self.state=false;}fn is_wakeup(&self)->bool{self.state }fn wakeup(&mut self){println!("{} 起来!",self.name);   self.state=true;}}}

 

main.rs

mod animals;use animals::animals::{Animal, Dog, Cat};fn main(){let mut dog= Dog::new(String::from("小虎"));let mut cat= Cat::new(String::from("小白"));dog.run();cat.run();dog.sleep();cat.sleep();dog.run();cat.run();//
   dog.wakeup();cat.wakeup();let fish=String::from("骨头");dog.eat(&fish);cat.eat(&fish);let bone=String::from("");dog.eat(&bone);cat.eat(&bone);
}

 

测试下:

 

如果用上继承,那么is_wakeup函数完全不需要写两遍。

 

二、小结

总之,rust对于oop的支持主要体现两点:

  • 封装-靠struct,enum
  • 多态-通用类型+特质

也许某天,rust会把特质设计的更体贴(复杂),但可能性不是太大,盖因rustc已经足够复杂了。

 

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

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

相关文章

Docker 数据卷容器-数据卷备份和还原

以下是关于 Docker 数据卷容器 的详细总结,以及如何进行 数据卷备份和还原 的说明:1. 什么是 Docker 数据卷容器? 概念:数据卷容器 是一种特殊的容器,用于存储和管理数据卷。 它的主要作用是让多个容器通过挂载同一个数据卷容器来实现 数据共享 和 独立管理。 数据卷容器的…

01 C++ 与 C 的区别 class类

描述确定一个事物,是行为(功能),而不是数据。例如:写字的,吸墨水的,笔尖是金属的。(毛笔)行为描述这个事物是钢笔。而不是黑色的等数据。 软件设计模式: 先搞清有哪些事物,联系人个人信息 C语言模块化设计与C++面向对象设计的区别:分离实体、找对象、拉关系。 分离…

机房杀(中国OIer都在玩的益智游戏)

基础牌 内卷:当作杀使用,可以在影响范围内指定一名角色产生一点伤害 刷题:当作闪使用,可以抵消掉对方内卷带来的伤害 睡觉:当作桃使用,可以恢复一滴血 切题:和内卷一起使用可以对对方造成两点伤害 技能牌 教练来了:所有玩家必须打出一张内卷,否则造成一点伤害 我是卷怪…

代码编写与实践

高质量代码编写 遵循规范:严格遵循 Java 编码规范,如 Google Java 风格指南,确保代码具有良好的可读性和可维护性。规范的代码结构有助于团队协作,也方便自己后续的代码审查和修改。 运用设计模式:学习并在项目中合理运用设计模式,如单例模式、工厂模式、观察者模式等。设…

Git 仓库瘦身

如有错误和建议请评论告知。Git 版本库如何瘦身? 随着git仓库的使用,仓库的体积越来越大,主要是.git文件夹记录了所有的历史记录。它能否“瘦身”呢?又该如何操作呢? 查看仓库的存储统计信息 $ git count-objects -vH count: 91 size: 888.88 KiB in-pack: 1250 packs: 1…

迁移Windows AD五种架构主机

迁移Windows AD五种架构主机 五种架构主机 Active Directory 定义了五种操作主机角色(又称FSMO): 架构主机 schema master功能:控制活动目录内所有对象/属性的定义 ,AD数据库的表头定义权限组:Schema Admins组故障影响:更新Schema受影响 ,短期内一般看不到影响域命名主…

鲜花:驳 abc 没落论

md 太对了驳不了一点。

【后端】简化部署设计方案——内层设计方案

根据《简化部署设计方案V2》的内容,内层部署需要提供的 .sh 脚本应覆盖部署流程的各个阶段,确保组件能够顺利安装、配置、启动、检查状态,并支持升级和卸载。 一、 部署某组件所需的内层结构 左侧是约定的内层结构,右侧的其他部署的内容物,按需存放即可。1.1 scripts目录:…