网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
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` 两个变体
+ 结构体被`pub`修饰,可以被外部访问,但是两个变体不可以被访问
+ 两个变体的修改交给下面定义的其他`pub`修饰的方法
* `add`与`remove` 完成`list`集合的元素添加与删除,默认调用封装的更新方法
* `update_average` 用来更新平均数,而`average`方法被`pub`修饰,外部可以直接访问平均数
>
> 由此示例可知 `Rust` 结构体等类型默认是私有的,相当于`C++/Java`中的`private`,而被`pub`修饰后相当于`public`,合理利用这些关键字可以做到封装的效果。
>
>
>
## 2、实现继承(trait)
继承可以使对象沿用另外一个对象的数据和行为,无需定义相关代码,代码复用效率高。`Rust` 中不存在继承,但是可以通过 `trait` 方法来实现代码共享,且可以在 `trait` 中覆盖定义的方法,这就相当于主流语言中的子类继承父类与重写父类方法。
### 2.1、为共有行为定义一个 Trait
**Rust 避免将 `struct`或 `enum` 称为对象,因为它们与`impl`块是分开的。**
* trait对象有些类似于其它语言中的对象:
+ 它们某种程度上组合了数据与行为
* trait 对象与传统对象不同的地方:
+ 无法为 trait对象添加数据
* trait对象被专门用于抽象某些共有行为,它没其它语言中的对象那么通用
### 2.2、Trait 对象执行的是动态派发
* 将`trait`约束作用于泛型时,Rust编译器会执行**单态化**:
+ 编译器会为我们用来替换泛型类型参数的每一个具体类型生成对应函数和方法的非泛型实现
* 通过单态化生成的代码会执行静态派发(`static dispatch`),在编译过程中确定调用的具体方法
* **动态派发**(`dynamic dispatch`) :
+ 无法在编译过程中确定你调用的究竟是哪一种方法
+ 编译器会产生额外的代码以便在运行时找出希望调用的方法
* 使用trait 对象,会执行动态派发:
+ 产生运行时开销
+ 阻止编译器内联方法代码,使得部分优化操作无法进行
### 2.3、Trait对象必须保证对象安全
* 只能把满足对象安全(`object-safe`)的 trait 转化为 trait 对象。
* Rust采用一系列规则来判定某个对象是否安全,只需记住两条:
+ 方法的返回类型不是`Self`
+ 方法中不包含任何泛型类型参数
## 3、实现多态(结合泛型)
继承是多态(`Polymorphism`)思想的实现,**多态**指的是编程语言可以处理多种类型数据的代码,在 `Rust`中使用**泛型**与 **trait 约束**(限定参数化多态 `bounded parametric`)模拟多态的使用。
>
> 有关Rust 泛型与特性的知识在本专栏前面已经介绍过,帮大家放个链接:[Rust 泛型与特性](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)
>
>
>
## 4、面向对象的设计模式
状态模式(`state pattern`)是一种面向对象设计模式:
* 一个值拥有的内部状态由数个状态对象`(state object`)表达而成,而值的行为则随着内
部状态的改变而改变
* 使用状态模式意味着:
+ 业务需求变化时,不需要修改持有状态的值的代码,或者使用这个值的代码
+ 只需要更新状态对象内部的代码,以便改变其规则。或者增加一些新的状态对象
* 状态模式的缺点:
+ 某些状态之间是相互耦合的
+ 需要重复实现一些逻辑代码
---
**Rust不仅能够实现面向对象的设计模式,还可以支持更多的模式**,例如:
将状态和行为编码为类型:
Rust 类型检查系统会通过编译时错误来阻止用户使用无效的状态。
![img](https://img-blog.csdnimg.cn/img_convert/1bdd203ae36d46594681c42082ea5be4.png)
![img](https://img-blog.csdnimg.cn/img_convert/03ee6677bd687c29e990a7e435982804.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
0ff254613a03fab5e56a57acb)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**