【发布时间】:2021-05-26 03:03:47
【问题描述】:
由于Rust不支持继承,我们不能重用另一个struct的状态。
以Head First Design Patterns为例,一个抽象的Duck类有一个属性FlyBehavior,它还提供getter和setter。
abstract class Duck {
private FlyBehavior flyBehavior;
public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; }
public FlyBehavior getFlyBehavior() { return this.flyBehavior; }
}
但是,在 Rust 中,我们无法编写默认实现以供重用。
trait Duck {
fn get_fly_behavior(&self) -> &dyn FlyBehavior;
fn set_fly_behavior(&mut self, fly_behavior: Box<dyn FlyBehavior>);
}
并且任何实现Duck 的结构都必须编写相同 getter 和setter。那么,有没有什么惯用的方法可以在 Rust 中重用 getter 和 setter 的实现?
【问题讨论】:
-
这并不能回答你的问题,但让我给你一个一般性的建议:不要试图将 OOP 设计模式应用于 Rust。它们中的大多数根本不映射到 Rust,并且在 Rust 中没有用。例如,getter/setter 对在大多数 Rust 代码中相当少见。我知道忘记东西很难,但是 Rust 思考问题的方式与 OOP 完全不同。如果你愿意,你可以在 Rust 论坛上解释你试图解决的一般问题,并询问如何用惯用的 Rust 解决它。我认为这可能比回答这个确切的问题更有帮助。
-
另外,你几乎肯定希望
FlyBehavior成为一个枚举。让它成为一个 trait 几乎就像是故意模仿 OOP 到 Rust 的糟糕映射。 (请不要认为这句话不友好,对概念上的枚举使用动态调度在 Rust 中看起来非常奇怪。)
标签: rust code-reuse trait-objects