我有一些默认实现的特性,需要相同的方法,恰好是字段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 }
}
答案 0 :(得分:4)
最好的选择可能是你的对象可以有一个位置:
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
特征,这样您就可以从运算符重载+
和{{1}中受益}。即使您不直接使用这些特征,它们也可能激发您对潜在-
函数(add(&self, rhs: &P) -> P
)的有意义签名。