Supertraits

A trait can have one or more supertraits.

trait Walkable {
    fn walk(&self, steps: i32);
}

trait Talkable {
    fn talk(&self, times: i32);
}

trait Human: Walkable + Talkable {
    fn laugh(&self, times: i32);
}

struct Person;

impl Walkable for Person {
    fn walk(&self, steps: i32) {
        println!("I walk {steps} stpes.");
    }
}

impl Talkable for Person {
    fn talk(&self, times: i32) {
        println!("I talk {times} times.");
    }
}

impl Human for Person {
    fn laugh(&self, times: i32) {
        println!("I laugh {times} times.");
    }
}

fn act_like_a_human(bloke : &dyn Human) {
    bloke.walk(10);
    bloke.laugh(10);
    bloke.talk(10);
}

fn main() {
    act_like_a_human(&Person{});
}