Супертрейты
Трейт может требовать, чтобы типы, его реализующие, также реализовывали другие трейты, которые называются супертрейтами. Здесь любой тип, реализующий 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());
}
Иногда это называют «наследованием трейтов», но студенты не должны ожидать, что оно будет работать как объектно-ориентированное наследование. Это просто задаёт дополнительное требование к реализациям трейта.