我有一些默认实现的特征需要相同的方法,这些方法恰好是字段 getter。
trait AddPosition<T: Display>{
fn x(&self) -> T;
fn y(&self) -> T;
fn add(&self){
println!("{:}", self.x()+self.x());
}
}
trait SubPosition<T: Display>{
fn x(&self) -> T;
fn y(&self) -> T;
fn sub(&self){
println!("{:}", self.x()-self.y());
}
}
我可以有这样的东西,而不是为每个特征实现手动重复相同的代码吗?
impl AddPosition<i32>, SubPosition<i32> for Point{
fn x(&self) -> i32{ self.x }
fn y(&self) -> i32{ self.y }
}
最佳答案
最好的选择可能是考虑到您的对象可以有一个位置的事实:
trait Position<T: Display> {
fn x(&self) -> T;
fn y(&self) -> T;
}
// trait AAA: BBB --> means AAA must implement BBB
trait AddPosition<T: Add<Output=T> + Display>: Position<T> {
fn add(&self){
println!("{:}", self.x()+self.x()); // ?
}
}
trait SubPosition<T: Sub<Output=T> + Display>: Position<T> {
fn sub(&self){
println!("{:}", self.x()-self.y()); // ?
}
}
struct MyPosition {
x: i32,
y: i32,
}
impl Position<i32> for MyPosition {
fn x(&self) -> i32 { self.x }
fn y(&self) -> i32 { self.y }
}
impl SubPosition<i32> for MyPosition {}
impl AddPosition<i32> for MyPosition {}
但是,我无法理解您的代码的真正意义( ?
带注释的行)。如果这只是为了最小的例子,那完全没问题;但是,如果这适用于任何严肃的代码,您可能需要查看 Add
和Sub
特征,这将使您受益于运算符重载 +
和-
。即使您不直接使用这些特征,它们也可能会激发您对潜在的有意义的签名 add(&self, rhs: &P) -> P
函数(其中 P: Position<T>
)。
关于rust - 如何重用类似特征实现的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32416186/