2015-09-05 53 views
2

我有幾個缺省實現需要相同方法的特性,這些特性恰好是字段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 } 
} 

回答

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 {} 

(Playground)

不過,我不明白你的代碼是如何真正有意義( ?帶註釋的行)。如果這僅僅是爲了最小的例子,這是完全正確的;然而,如果這是針對任何嚴重的代碼,您可能需要查看AddSub特徵,這將使您受益於運營商超載+-。即使您不直接使用這些特徵,它們也可能會激發您獲得潛在add(&self, rhs: &P) -> P函數的有意義簽名(其中P: Position<T>)。

+0

而我該如何'impl' AddPosition和SubPosition呢? – tower120

+0

請參閱編輯,其中包括實施AddPosition和SubPosition的結構示例。 – mdup

+1

(另一個Rustacean的相鄰問題:作爲一個方法處理的方法,潛在名稱與'x()'是如何衝突的?) – mdup

相關問題