Trait繼承

通過讓某個類型去實現某個Trait,使得該類型具備該Trait的功能,是組合(composite)的方式。

經常和組合放在一起討論的是繼承(inheritance)。繼承通常用來描述屬於同種性質的父子關係(is a),而組合用來描述具有某功能(has a)

例如,支持繼承的語言,可以讓轎車類型(Car)繼承交通工具類型(Vehicle),表明轎車是一種(is a)交通工具,它們是同一種性質的東西。而如果是支持組合的語言,可以定義可駕駛功能Drivable,然後將Driveable組合到轎車類型、輪船類型、飛機類型、卡車類型、玩具車類型,等等,表明這些類型具有(has a)駕駛功能。

Rust除了支持組合,還支持繼承。但Rust只支持Trait之間的繼承,比如Trait A繼承Trait B。實現繼承的方式很簡單,在定義Trait A時使用冒號加上Trait B即可。

例如:


#![allow(unused)]
fn main() {
trait B{}
trait A: B{}
}

如果Trait A繼承Trait B,當類型C想要實現Trait A時,將要求同時也要去實現B。


#![allow(unused)]
fn main() {
trait B{
  fn func_in_b(&self);
}

// Trait A繼承Trait B
trait A: B{
  fn func_in_a(&self);
}

struct C{}
// C實現Trait A
impl A for C {
  fn func_in_a(&self){
    println!("impl: func_in_a");
  }
}
// C還要實現Trait B
impl B for C {
  fn func_in_b(&self){
    println!("impl: func_in_b");
  }
}
}

現在,C的實例對象將可以調用func_in_a()func_in_b()

fn main(){
  let c = C{};
  c.func_in_a();
  c.func_in_b();
}