Supertraits

A trait can require that types implementing it also implement other traits, called supertraits. Here, any type implementing Pet must implement Animal.

1. ```
   trait Animal {
   ```
2. ```
       fn leg_count(&self) -> u32;
   ```
3. ```
   }
   ```

5. ```
   trait Pet: Animal {
   ```
6. ```
       fn name(&self) -> String;
   ```
7. ```
   }
   ```

9. ```
   struct Dog(String);
   ```

11. ```
    impl Animal for Dog {
    ```
12. ```
        fn leg_count(&self) -> u32 {
    ```
13. ```
            4
    ```
14. ```
        }
    ```
15. ```
    }
    ```

17. ```
    impl Pet for Dog {
    ```
18. ```
        fn name(&self) -> String {
    ```
19. ```
            self.0.clone()
    ```
20. ```
        }
    ```
21. ```
    }
    ```

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

This is sometimes called “trait inheritance” but students should not expect this to behave like OO inheritance. It just specifies an additional requirement on implementations of a trait.