Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Супертрейты

Трейт может требовать, чтобы типы, его реализующие, также реализовывали другие трейты, которые называются супертрейтами. Здесь любой тип, реализующий Pet, должен реализовать Animal.

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

trait Animal {
    fn leg_count(&self) -> u32;
}

trait Pet: Animal {
    fn name(&self) -> String;
}

struct Dog(String);

impl Animal for Dog {
    fn leg_count(&self) -> u32 {
        4
    }
}

impl Pet for Dog {
    fn name(&self) -> String {
        self.0.clone()
    }
}

fn main() {
    let puppy = Dog(String::from("Rex"));
    println!("{} has {} legs", puppy.name(), puppy.leg_count());
}

Иногда это называют «наследованием трейтов», но студенты не должны ожидать, что оно будет работать как объектно-ориентированное наследование. Это просто задаёт дополнительное требование к реализациям трейта.