2016-01-23 34 views
0

我有以下代碼:實現繼承的衍生性狀的實現模塊功能

trait A { 
    fn foo(&self); 
} 

trait B { 
    fn bar(&self); 
} 

trait C : A + B { 
} 

struct S; 

impl A for S { 
    fn foo(&self) { 
     println!("In S->foo()"); 
    } 
} 

impl B for S { 
    fn bar(&self) { 
     println!("In S->bar()"); 
    } 
} 

impl C for S { 
} 

fn main() { 
    let s = S; 
    s.foo(); 
    s.bar(); 
} 

(防鏽操場鏈接:http://is.gd/pde2LE

是否有可能只實現CS和實施foobar該實現塊中的函數?我嘗試以下,但它失敗:

trait A { 
    fn foo(&self); 
} 

trait B { 
    fn bar(&self); 
} 

trait C : A + B { 
} 

struct S; 

impl C for S { 
    fn foo(&self) { 
     println!("In S->foo()"); 
    } 

    fn bar(&self) { 
     println!("In S->bar()"); 
    } 
} 

fn main() { 
    let s = S; 
    s.foo(); 
    s.bar(); 
} 

(防鏽操場鏈接:http://is.gd/CqA6J5

+1

不,這是不可能的。 – Veedrac

回答

4

要擴大Veedrac的評論:不,這是不可能的,特別是因爲性狀的遺傳並不意味着同樣的事情作爲Java等面嚮對象語言的繼承。

在Rust中,特徵繼承更接近Haskell的類型繼承。如果特質A繼承特質B

trait A: B { ... } 

它僅僅意味着「如果某種類型T實現A,它還必須實現B」。這不是「是 - 一種」關係,而是一種特殊的限制。性狀本身仍然是不相交的。因此,如果您要爲您的類型實施A,則必須明確實施特徵B