我知道我应该使用组合而不是继承。
在 Java/C++ 中,我有一个抽象基类Vehicle
(带有属性和常用方法)和实现它的类,例如Car
和Bike
.
我发现enum_dispatch
,它在将方法调用从父级转发到子“类”方面做得很好。
#[enum_dispatch]
pub trait VehicleDelegation {
fn drive(&mut self) -> anyhow::Result<()>;
}
#[enum_dispatch(VehicleDelegation)]
pub enum Vehicle {
Car,
Bike,
}
pub struct Car {
pub doors: u8
}
impl VehicleDelegation for Car {
fn drive(&mut self) -> anyhow::Result<()> {
// do car stuff
Ok(())
}
}
pub struct Bike {
pub frame_size: u8
}
impl VehicleDelegation for Bike {
fn drive(&mut self) -> anyhow::Result<()> {
// do bike stuff
Ok(())
}
}
- 我应该在哪里存储公共数据,例如
num_wheels
哪些是 的属性Vehicle
? - 我应该在哪里定义
Vehicle
使用公共数据的方法?
目前,我必须将所有Vehicle
数据和方法复制到每个枚举变体中,这越来越令人厌烦,因为它随着“方法”的数量和“类”的数量而扩展。
- 我如何在 Rust 中惯用地做到这一点?