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