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(); }