スーパートレイト
Rust には「継承」はありませんが、あるトレイトを別のトレイトの上位集合として定義できます。例:
trait Person { fn name(&self) -> String; } // Person は Student のスーパートレイトです。 // Student を実装するには、Person も impl する必要があります。 trait Student: Person { fn university(&self) -> String; } trait Programmer { fn fav_language(&self) -> String; } // CompSciStudent(コンピューターサイエンスの学生)は Programmer と Student の両方のサブトレイトです。 // CompSciStudent を実装するには、両方のスーパートレイトを impl する必要があります。 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); }