先上一段Rust代码:
1trait A { 2 fn say(self); 3} 4 5trait B { 6 fn say(self); 7} 8 9struct S; 10 11impl A for S { 12 fn say(self) { 13 println!("S say: A"); 14 } 15} 16 17impl B for S { 18 fn say(self) { 19 println!("S say: B"); 20 } 21} 22 23fn say_a<T: A>(t: T) { 24 t.say(); 25} 26 27fn say_b<T: B>(t: T) { 28 t.say(); 29} 30 31fn main() { 32 say_a(S); 33 say_b(S); 34}
给java和php的童鞋的解释就是:两个接口A和B,一个类S,S分别针对A和B实现了say()这个方法。
因为这在java或php(抄袭java的面向对象)是不可能的,万恶的根源在于他们是将类的所有方法都写在类这个域里面,然后得出“多继承”可能会导致函数冲突(两个父类拥有相同原型的函数)的荒谬理论。
在Rust中,得益于成员函数写在了struct之外(而且可以是多个impl的域),函数冲突的问题重来就没有过。
另外Rust的trait可以有默认实现,和有函数实体的父类异曲同工。
====
2016.6.10
Rust没有继承,struct之间并不能复用代码。