Rust特性在链式继承中进行扩展和重写



我对Rust非常陌生(我很喜欢它:p(,但我在一些实现方面遇到了困难。我的背景是Python,所以我正在尝试应用一些类似继承的代码。例如,在Python:中

class A:
def a_A_implemented_method(self):
return "This is an implemented method from A."
def an_abstract_method(self):
pass
class B(A):
def a_B_implemented_method(self):
return "This is an implemented method from B."
def an_abstract_method(self):
return "A's abstract method is overridden"
def another_abstract_method(self):
pass
class C(B):
def a_C_implemented_method(self):
return "This is an implemented method from C."
def another_abstract_method(self):
return "B's abstract method is overridden"
def a_general_method(self):
return "I am here to help."

在Rust中,对于类似的行为,我正在尝试类似的东西(我对字符串还不是很熟练,所以我会像示例中那样保持简单和更有意图(,

trait A {
fn a_A_implemented_method(&self) -> String {"This is an implemented method from A."}
fn an_abstract_method(&self) -> String;
}
trait B {
fn a_B_implemented_method(&slef) -> String {"This is an implemented method from B."}
fn another_abstract_method(&self) -> String;
}
impl A for B {
fn an_abstract_method(&self) -> String {"A's abstract method is overridden"};
}
struct C {}
trait C {
fn a_C_implemented_method(&slef) -> String {"This is an implemented method from C."}
fn a_general_method(&self) -> String {"I am here to help."};
}
impl B for C {
fn an_abstract_method(&self) -> String {"A's abstract method is overridden"};
}

但是,由于许多原因,这是行不通的。

例如,当我制作impl A for B时,编译器会抱怨dyn B,但我希望避免这种情况,并保持简单(我认为我不需要dyn B(。

trait C中,编译器抱怨变量名已经存在,难道我不能有一个同名的结构和特征吗?如果是这样的话,我怎么能拥有属性和方法呢?

为什么编译器抱怨dyn B?我该如何避免?

你能帮助我理解类似的东西是如何在Rust中实现的,并填补我所缺少的空白吗?

非常感谢您的帮助!:D

基于特征的系统与其他语言的继承有些不一致。

考虑到这一点,有一种使用structs和enum的模式可能会在这里应用。

trait A {
fn my_method(&self) -> String;
}
struct B {}
struct C {}
impl A for B {
fn my_method(&self) -> String {
"Hello from B".to_owned()
}
}
impl A for C {
fn my_method(&self) -> String {
"Hello from C".to_owned()
}
}

有点像定义了一个抽象方法,您可以创建一个通用方法,该方法将与实现所需特性的任何输入类型一起工作。

pub fn greet<T: A>(t: &T) {
println!("{}", t.my_method());
}

最新更新