スーパートレイト

トレイトは、それを実装する型に対して、スーパートレイト と呼ばれる他のトレイトの実装も要求できます。ここでは、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());
}

これは「トレイト継承」と呼ばれることもありますが、受講者はこれがオブジェクト指向の継承のように振る舞うと期待すべきではありません。これは単に、トレイトの実装に追加の要件を指定しているだけです。