如何解决Rust:如何重用 getter 和 setter 的实现?
由于 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();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。