Как мне реализовать иерархические черты? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть две черты в иерархии: Animal и Bird. Как я могу создать Chicken, который реализует Bird?

trait Animal {
    fn noise(&self) -> String;
    fn print_noise(&self) {
        print!("{}", self.noise());
    }
}

trait Bird: Animal {
    fn noise(&self) -> String {
        "chirp"
    }
}

struct Chicken {}

impl Bird for Chicken {}

площадка

Когда я пытаюсь скомпилировать, я получаю:

error[E0277]: the trait bound `Chicken: Animal` is not satisfied
  --> src/lib.rs:16:6
   |
16 | impl Bird for Chicken {}
   |      ^^^^ the trait `Animal` is not implemented for `Chicken`

Я не хочу реализовывать Animal до Bird, потому что я хочу, чтобы Chicken наследовал функцию noise от Bird.

1 Ответ

0 голосов
/ 06 ноября 2018

Простой ответ: вы не можете. Ржавчина не имеет наследства по замыслу. Rust не имеет такой же объектно-ориентированной модели, как Java или C ++.

Если вы действительно хотите сделать что-то подобное, вы можете реализовать одну черту для другой с помощью this code

trait Animal {
    fn noise(&self) -> String;
    fn print_noise(&self) {
        print!("{}", self.noise());
    }
}

trait Bird:Animal {}

impl<T: Bird> Animal for T {
    fn noise(&self) -> String {
        "chirp".to_string()
    }
}


struct Chicken {}

impl Bird for Chicken {}

fn main() {
    let chicken = Chicken{};
    chicken.print_noise();
}

Как и другим, я бы предложил прочитать книгу Rust Programming Language , в частности OOP и Черты и Обобщения . Это бесплатно при онлайн-чтении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...