在派生特征的实现块中实现继承的函数

时间:2016-01-23 01:23:23

标签: rust

我有以下代码:

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

(Rust playground link:http://is.gd/pde2LE

是否可以仅为C实施S并在该实施块中实施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();
}

(Rust playground link:http://is.gd/CqA6J5

1 个答案:

答案 0 :(得分:5)

扩展Veedrac的评论:不,这是不可能的,特别是因为特征继承与Java等OO语言的继承并不相同。

在Rust中,trait继承更接近Haskell的类型类继承。如果特质A继承了特质B

trait A: B { ... }

它只表示“如果某个类型T实现A,它还必须实现B”。它不是“是一种”关系,而是一种特殊的约束。特质本身仍然是不相交的。因此,如果要为您的类型实施B,则必须明确实施特征A