2014-10-14 2 views
6

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

пример:

trait SomeTrait { 
    fn get_num(self) -> uint; 
    fn add_to_num(self) -> uint { 
     self.get_num() + 1 
    } 
} 

struct SomeStruct; 
impl SomeTrait for SomeStruct { 
    fn get_num(self) -> uint { 3 } 
    fn add_to_num(self) -> uint { 
     self.get_num() + 2 
    } 
} 

fn main() { 
    let the_struct = SomeStruct; 
    println!("{}", the_struct.add_to_num()): // how can I get this to print 4 instead of 5? 
} 

ответ

5

Там может быть лучшим решением, но один я придумал, чтобы просто определить фиктивную структуру, которая содержит-структуру, я хочу изменить, и тогда я могу Cherry- выберите, какие методы я хочу переписать, и какие из них я хочу сохранить по умолчанию. Чтобы расширить исходный пример:

trait SomeTrait { 
    fn get_num(self) -> uint; 
    fn add_to_num(self) -> uint { 
     self.get_num() + 1 
    } 
} 

struct SomeStruct; 

impl SomeTrait for SomeStruct { 
    fn get_num(self) -> uint { 3 } 
    fn add_to_num(self) -> uint { 
     self.get_num() + 2 
    } 
} 

fn main() { 

    struct SomeOtherStruct { 
     base: SomeStruct 
    } 

    impl SomeTrait for SomeOtherStruct { 
     fn get_num(self) -> uint { 
      self.base.get_num() 
     } 
     //This dummy struct keeps the default behavior of add_to_num() 
    } 

    let the_struct = SomeStruct; 
    println!("{}", the_struct.add_to_num()); 

    //now we can call the default method using the original struct's data. 
    println!("{}", SomeOtherStruct{base:the_struct}.add_to_num()); 
} 
Смежные вопросы