1. rust是面向对象语言吗?
Rust在设计的时候受到各种编程范式的影响,包括面向对象。
面向对象通常包含以下特性:命名对象、封装、继承。
我们所说的对象包含数据和行为,“设计模式四人帮”在《设计模式》中给出面向对象的定义如下:
- 面向对象的程序由对象组成
- 对象包装了数据和操作这些数据的过程,这些过程通常被称为方法或操作
基于以上定义,rust是面向对象的
- struct、enum包含数据
- impl块为之提供了方法
- 但在rust里,带有方法的struct、enum并没有被称为对象
2. 封装
封装指的是:调用对象外部的代码无法直接访问对象内部的实现细节,唯一可以与对象进行交互的方法就是通过它公开的API。
在rust里我们使用pub关键字来决定哪些函数或方法是公开的,而默认情况下都是私有的。
看一个案例:
pub struct AveragedCollection {
list: Vec<i32>,
average: f64,
}
impl AveragedCollection {
pub fn add(&mut self, value: i32) {
self.list.push(value);
self.update_average();
}
pub fn remove(&mut self) -> Option<i32> {
let result = self.list.pop();
match result {
Some(value) => {
self.update_average();
Some(value)
}
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是私有的,需要提供对外的修改方法。
- list提供新增和删除
- add
- remove
- average提供访问和更新
- average
- update_average
这就实现了所说的封装。
3. 继承
继承指的是:使对象可以沿用另外一个对象的数据和行为,且无需重复定义相关代码。
- rust没有继承,
- 使用继承的其中一个原因:
- 通常是希望代码能够复用。
- 使用继承的另一个原因是使用多态。
不过,现在很多编程语言都不使用继承作为内置的程序设计方案了。