Rust doesn't have “inheritance”, but you can define a trait as being a superset of another trait. For example:
trait Person { fn name(&self) -> String; } // Person is a supertrait of Student. // Implementing Student requires you to also impl Person. trait Student: Person { fn university(&self) -> String; } trait Programmer { fn fav_language(&self) -> String; } // CompSciStudent (computer science student) is a subtrait of both Programmer // and Student. Implementing CompSciStudent requires you to impl both supertraits. trait CompSciStudent: Programmer + Student { fn git_username(&self) -> String; } fn comp_sci_student_greeting(student: &dyn CompSciStudent) -> String { format!( "My name is {} and I attend {}. My favorite language is {}. My Git username is {}", student.name(), student.university(), student.fav_language(), student.git_username() ) } struct CSStudent { name: String, university: String, fav_language: String, git_username: String } impl Programmer for CSStudent { fn fav_language(&self) -> String { self.fav_language.clone() } } impl Student for CSStudent { fn university(&self) -> String { self.university.clone() } } impl Person for CSStudent { fn name(&self) -> String { self.name.clone() } } impl CompSciStudent for CSStudent { fn git_username(&self) -> String { self.git_username.clone() } } fn main() { let student = CSStudent { name: String::from("Alice"), university: String::from("MIT"), fav_language: String::from("Rust"), git_username: String::from("alice_codes"), }; let greeting = comp_sci_student_greeting(&student); println!("{}", greeting); }