Rust:如何重用getter和setter的实现?

Rust:如何重用getter和setter的实现?,rust,code-reuse,trait-objects,Rust,Code Reuse,Trait Objects,由于Rust不支持继承,我们不能重用另一个struct的状态 以Head-First设计模式为例,抽象的Duck类有一个属性FlyBehavior,它还提供getter和setter 抽象类Duck{ 私人飞行行为; public void setFlyBehavior(FlyBehavior FlyBehavior){this.FlyBehavior=FlyBehavior;} public FlyBehavior getFlyBehavior(){返回this.FlyBehavior;} }

由于
Rust
不支持继承,我们不能重用另一个
struct
的状态

以Head-First设计模式为例,抽象的
Duck
类有一个属性
FlyBehavior
,它还提供
getter
setter

抽象类Duck{
私人飞行行为;
public void setFlyBehavior(FlyBehavior FlyBehavior){this.FlyBehavior=FlyBehavior;}
public FlyBehavior getFlyBehavior(){返回this.FlyBehavior;}
}
但是,在Rust中,我们无法编写用于重用的默认实现

trait Duck{
fn获取飞行行为(&self)->&dyn飞行行为;
fn设置飞行行为(&mut self,飞行行为:框);
}

任何实现
Duck
的结构都必须编写相同的getter和
setter
。那么,有什么惯用的方法可以重用Rust中的
getter
setter
实现吗?

您可以通过在要实现特性的结构中提供字段
fly\u behavior
来重用您发布的特性,如下演示确保了这一点

trait飞行行为{
fn fun(和self);
}
特质鸭{
fn获取飞行行为(&self)->&dyn飞行行为;
fn设置飞行行为(&mut self,飞行行为:框);
}
结构行为1{}
结构行为2{}
结构对象{
飞行行为:盒子,
}
DuckObject的impl Duck{
fn获取飞行行为(&self)->&dyn飞行行为{
&*自我放飞行为
}
fn设置飞行行为(&mut self,飞行行为:框){
self.fly\u behavior=fly\u behavior
}
}
Behavior1的impl FlyBehavior{
fn乐趣(自我){
println!(“行为1”)
}
}
Behavior2的impl FlyBehavior{
fn乐趣(自我){
println!(“行为2”)
}
}
fn main(){
让mut duck=DuckObject{fly_behavior:Box::new(Behavior1{});
鸭子。获得飞行行为。乐趣();
set_fly_行为(Box::new(Behavior2{}));
鸭子。获得飞行行为。乐趣();
}

你可能不明白我的意思。现在,每个实现
Duck
的结构仍然必须编写相同的get/set代码。例如,如果一个
DuckObject2
?然后,
impl Duck for DuckObject2
将重复您编写的所有内容。@chenhongpu我认为问题的关键在于您无法重用该特性或无法实现它。但是如果你想避免重复,可以使用程序宏。例如,使用
#[derivate(std::fmt::Debug)]
所做的事情谢谢您的提示。我认为编写设计模式有点不方便(例如,示例中的
strategy
),因为Rust不支持继承。所以,我想知道在生锈的情况下最好的做法是什么。这并不能回答你的问题,但让我给你一个一般性的建议:不要试图将OOP设计模式应用于生锈。它们中的大多数根本不映射到锈迹,在锈迹中也没有用处。例如,在大多数代码中,getter/setter对非常罕见。我知道很难忘记一些东西,但Rust对问题的思考方式与OOP完全不同。如果您愿意,您可以在Rust论坛上解释您试图解决的一般问题,并询问如何在惯用的Rust中解决它。我认为这可能比回答这个确切的问题更有帮助。而且,您几乎肯定希望
FlyBehavior
成为枚举。让它成为一种特性几乎像是故意模仿OOP到Rust的糟糕映射。(请不要认为这句话不友好,对概念上的枚举使用动态分派看起来非常奇怪。)