面向对象编程 ,就是常说的OOP,主要就是搞对象了。一个 对象 包含数据和操作这些数据的过程。这些过程 通常被称为 方法 或 操作。
就这个定义来说,Rust 是面向对象的。结构体和枚举包含数据, impl 块提供了在结构体和枚 举之上的方法。 在rust里,没有专门的class,这个在其它语言里看腻的词,它用strust 和 enum 。
OOP还有个特性: 用封装来隐藏实现细节 ,这个Rust可以做到。看例子吧,注意,凡是没有pub的都是私有的函数:
# pub struct AveragedCollection {
# list: Vec<i32>,
# average: f64,
#}
//注意这个结构,结构前加了pub. 并不意味着,里面的所有项都可以随意访问
//如果能随便访问,封装就没有意义了
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;
}
}
OOP特征二:继承
一个对象可以定义为继承另一个对象的定义,这使其可以获得父对象的数据和行为,而无需重新定义。 继承的目的之一:代码重用,rust可以使用 train 方法来进行代码共享。 继承的目的之二:多态或多重类型系统。这个可以通过train 的impl 实现。没什么好说的了。
关于共享和继承的优劣,我是这样认为的,继承增加了子类与父类的耦合度和复杂性,这种全盘继承有时甚至是危险的。而共享让模块之间的关系变得简单和低耦合。
尤其现在是网上模块库的时代,用哪个块共享就行了。这其实让事情变得简单了。
想象一下,那些单继承,多继承,有时会象乱麻一样,让代码混乱不堪。
进一步观察。我觉得继承模型有点类似人情社会。你想跟儿子合作,你不得不考虑曾经揍过他爹。而共享模型象契约共享社会,需要什么网购就行了,管他那么多爹干嘛呢。
适度的认知模型可以让程序猿的工作轻松一点。
一天后补:今天看到二句,感觉和我昨天说的很一致,摘抄如下:
模块间耦合越少越好,继承是最深度的耦合。
“四人帮”的《设计模式》开宗明义:组合优于继承。