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

rus*_*oue 0 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();
}
Run Code Online (Sandbox Code Playgroud)

(Rust操场链接: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();
}
Run Code Online (Sandbox Code Playgroud)

(Rust操场链接:http://is.gd/CqA6J5)

Vla*_*eev 5

扩展Veedrac的评论:不,这是不可能的,特别是因为特征继承并不意味着像Java这样的OO语言的继承.

在Rust中,trait继承更接近Haskell的类类继承.如果trait A继承了trait B:

trait A: B { ... }
Run Code Online (Sandbox Code Playgroud)

它只意味着"如果某种类型T实现A,它也必须实现B".它不是"是一种"关系,而是一种特殊的约束.特质本身仍然是不相交的.因此,B如果要A为类型实现,则必须显式实现特征.