Supertraits

یک trait می‌تواند نیاز داشته باشد که تایپ‌هایی که آن را پیاده‌سازی می‌کنند، همچنین traits دیگری به نام supertraits را نیز پیاده‌سازی کنند. در اینجا، هر نوعی که Pet را پیاده‌سازی کند، باید Animal را نیز پیاده‌سازی کند.

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());
}

این گاهی اوقات "trait inheritance" نامیده می‌شود، اما دانش‌آموزان نباید انتظار داشته باشند که این رفتار مشابه وراثت در برنامه‌نویسی شیءگرا (OO) باشد. این تنها یک الزام اضافی بر روی پیاده‌سازی‌های یک trait را مشخص می‌کند.