2016-01-23 64 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