问题描述
由于 Rust
不支持继承,我们不能重用另一个 struct
的状态。
以Head First Design Patterns为例,一个抽象的Duck
类有一个属性FlyBehavior
,它还提供了getter
和{{1} }.
setter
但是,在 Rust 中,我们无法编写用于重用的默认实现。
abstract class Duck {
private FlyBehavior flyBehavior;
public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; }
public FlyBehavior getFlyBehavior() { return this.flyBehavior; }
}
并且任何实现 trait Duck {
fn get_fly_behavior(&self) -> &dyn FlyBehavior;
fn set_fly_behavior(&mut self,fly_behavior: Box<dyn FlyBehavior>);
}
的结构都必须编写 same Duck
和 getter
。那么,有没有什么惯用的方法可以在 Rust 中重用 setter
和 getter
的实现?
解决方法
您可以通过在要为其实现特征的结构中提供字段 fly_behavior
来重用您发布的特征,如以下演示确保
trait FlyBehavior {
fn fun(&self);
}
trait Duck {
fn get_fly_behavior(&self) -> &dyn FlyBehavior;
fn set_fly_behavior(&mut self,fly_behavior: Box<dyn FlyBehavior>);
}
struct Behavior1{}
struct Behavior2{}
struct DuckObject {
fly_behavior: Box<dyn FlyBehavior>,}
impl Duck for DuckObject {
fn get_fly_behavior(&self) -> &dyn FlyBehavior{
&*self.fly_behavior
}
fn set_fly_behavior(&mut self,fly_behavior: Box<dyn FlyBehavior>){
self.fly_behavior=fly_behavior
}
}
impl FlyBehavior for Behavior1{
fn fun(&self) {
println!("Behave1")
}
}
impl FlyBehavior for Behavior2{
fn fun(&self) {
println!("Behave2")
}
}
fn main() {
let mut duck = DuckObject{ fly_behavior: Box::new(Behavior1{}) };
duck.get_fly_behavior().fun();
duck.set_fly_behavior(Box::new(Behavior2{}));
duck.get_fly_behavior().fun();
}