rust学习十八.1、RUST的面向对象(oop)和简单示例
1.rust学习一、入门之搭建简单开发环境2.rust学习二、入门之运行单个脚本3.rust学习四、控制语句4.rust学习五、认识所有权5.rust学习三、基本类型6.rust学习六、简单的struct结构7.rust学习七、枚举8.rust学习八、包和模块9.rust学习九.1、集合之向量10.rust学习九.2、集合之字符串11.rust学习九.3、集合之哈希映射表12.rust学习十、异常处理(错误处理)13.rust学习十一.1、泛型(通用类型)14.rust学习十一.2、利用Trait(特质)定义通用类型的共同行为15.rust学习十一.3、生命周期标记16.rust学习十二、测试17.rust学习十二、一个I/O程序练习18.rust学习十三.1、匿名函数(闭包)19.rust学习十三.2、迭代器20.rust学习十四.1、编译和发布单元包Crate21.rust学习十四.2、工作空间(workspace)22.rust学习十五.1、智能指针基本概念23.rust学习十五.2、智能指针之Box(盒子)指针24.rust学习十五.3、智能指针相关的Deref和Drop特质25.rust学习十五.4、Rc和RefCell指针26.rust学习十五.5、引用循环和内存泄露27.rust学习十六.1、并发-乱弹和一个简单并发例子28.rust学习十六.2、并发-利用消息传递进行线程间通讯29.rust学习十六.3、并发-线程之间共享数据30.rust学习十七.1、async和await
31.rust学习十八.1、RUST的面向对象(oop)和简单示例
32.rust学习十九.1、模式匹配(match patterns)很可惜,出于一些理由,rust抛弃了OOP的核心特性之一:继承
其中一个理由应该是至关重要的,但是解释的比较模糊:继承增加了复杂性
的确,继承会让rust编译器变得更加复杂。rust编译器虽然足够体贴,但是它偏慢的编译速度也是很多人所吐槽的。
在我对rust编译了解更多之前,我对这个理由无法给出更加详细的描述,不过我能够理解。 说实话,编写这样的编译器已经足够复杂,如果还要
考虑到继承,大概这种复杂度会让编译器开发者崩溃。
至于其它的理由,例如认为组合足够好用,我觉得有些牵强了!
总之,rust对oop的支持主要体现在封装和多态。
而所谓的封装,在rust中主要体现在类似java对象的类型:struct,enum中,尤其是struct。
在rust中,struct的地位类似于java的Object。
所谓的多态,主要体现在特质(trait),这个时候的特质就类似于java,c++的接口(interface)
只不过,rust的这个特质是java的接口的阉割版本。
rust的特质作为接口存在的时候,只有以下两个功能:
- 没有实现的方法定义
- 具有默认实现的方法,类似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已经足够复杂了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)