2015-09-05 2 views
2

У меня есть несколько черт с реализацией по умолчанию, для которых требуются те же методы, которые являются полевыми getters.Как я могу повторно использовать код для аналогичных реализаций?

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)

Однако, я не понимаю, как ваш код действительно имеет смысл (? аннотированные строки). Если это только ради минимального примера, это совершенно нормально; однако, если это предназначено для любого серьезного кода, вы можете взглянуть на черту Add и Sub, что позволит вам воспользоваться перегрузкой оператора + и -. Даже если вы не используете эти черты напрямую, они могут вдохновить вас на значимые сигнатуры функции add(&self, rhs: &P) -> P (где P: Position<T>).

+0

И как я должен «имплантировать» AddPosition и SubPosition? – tower120

+0

См. Редактирование, которое включает пример структуры, реализующей AddPosition и SubPosition. – mdup

+1

(Смежный вопрос для другого Rustacean: как потенциальное имя сталкивается с 'x' как полем против' x() 'как обработанный метод? Я ожидал ошибку компилятора здесь.) – mdup

Смежные вопросы