我有以下代码:
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
并在该实施块中实施foo
和bar
函数?我尝试了以下但它失败了:
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)
答案 0 :(得分:5)
扩展Veedrac的评论:不,这是不可能的,特别是因为特征继承与Java等OO语言的继承并不相同。
在Rust中,trait继承更接近Haskell的类型类继承。如果特质A
继承了特质B
:
trait A: B { ... }
它只表示“如果某个类型T
实现A
,它还必须实现B
”。它不是“是一种”关系,而是一种特殊的约束。特质本身仍然是不相交的。因此,如果要为您的类型实施B
,则必须明确实施特征A
。