gpt4 book ai didi

enums - 我应该使用枚举还是盒装特征对象来模拟多态性?

转载 作者:行者123 更新时间:2023-11-29 07:47:37 26 4
gpt4 key购买 nike

使用枚举 Axes 来限制 CoordinateQuaternion:

#[derive(Clone)]
pub enum Axes {
Coordinate {
x: f64,
y: f64,
z: f64,
reserve: Vec<f64>,
},
Quaternion {
x: f64,
y: f64,
z: f64,
},
}

impl Axes {
pub fn shift(&mut self, Sample: &Axes) -> () {
let Dup: Axes = self.clone();
match Dup {
Axes::Coordinate { x, y, z, reserve } => match &Sample {
Axes::Coordinate { x, y, z, reserve } => {
*self = Axes::Coordinate {
x: *x,
y: *y,
z: *z,
reserve: reserve.to_vec(),
};
}
_ => panic!(),
},
Axes::Quaternion { x, y, z } => match &Sample {
Axes::Quaternion { x, y, z } => {
*self = Axes::Quaternion {
x: *x,
y: *y,
z: *z,
};
}
_ => panic!(),
},
}
}
}

使用 Axes 特征链接 CoordinateQuaternion 结构:

pub trait Axes {
fn shift(&mut self, Sample: &Axes) -> ();
fn fold(&mut self, Sample: &Axes) -> ();
}

pub struct Coordinate {
pub x: f64,
pub y: f64,
pub z: f64,
pub reserve: Vec<f64>,
}

pub struct Quaternion {
pub x: f64,
pub y: f64,
pub z: f64,
}

impl Axes for Coordinate {
fn shift(&mut self, Sample: &Axes) -> () {}
fn fold(&mut self, Sample: &Axes) -> () {}
}

impl Axes for Quaternion {
fn shift(&mut self, Sample: &Axes) -> () {}
fn fold(&mut self, Sample: &Axes) -> () {}
}

在这种情况下,在结构上实现的特征是否更易于访问且更高效?我对使用哪个以及在什么情况下使用感到困惑。

最佳答案

在您的情况下使用特征和枚举之间的最大区别之一是它们的可扩展性。如果你做 Axes一个枚举,然后这两个选项被硬编码到类型中。如果你想添加一些第三种形式的轴,你将不得不修改类型本身,这可能会涉及对使用 Axes 的代码进行大量修改。 (例如,您在 Axes 上匹配的任何地方都可能需要更改)。另一方面,如果你制作 Axes特性,您可以通过定义新类型并编写适当的实现来添加其他类型的轴,而无需修改现有代码。这甚至可以在图书馆外完成,例如由用户。

另一个需要考虑的重要事项是您需要对结构内部进行多少访问。使用枚举,您可以完全访问存储在结构中的所有数据。如果你想写一个可以同时操作 Coordinate 的函数和 Quaternion使用特征,那么您将能够执行的唯一操作是 Axes 中描述的操作特征(在本例中为 ShiftFold )。例如,给出 Axes 的实现你给了,你将无法简单地检索 (X,Y,Z)元组通过 Axes界面。如果您需要在某个时候执行此操作,则必须添加一个新方法。

如果不了解更多有关您计划如何使用这些类型的信息,则很难确定这些选项中的哪一个是更好的选择,但如果是我,我可能会使用枚举。最终,这在很大程度上取决于偏好,但希望这能让您了解在做出决定时需要考虑的各种事情。

关于enums - 我应该使用枚举还是盒装特征对象来模拟多态性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52240099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com