两个结构继承一个特征,但有额外的参数

Two structures inherit one trait, but with extra parameters

如何让两个结构继承一个特征,但有额外的参数?

而且我听说不建议在 Rust 中这样做。为什么?

struct Foo {name: String,}
struct FooPlus {name: String, lvl: i128,}

trait Trait {
    fn show(&self);
    fn new(name: &str) -> Self;
    // fn new(name: &str, lvl: i128) -> Self;
}

impl Trait for Foo {
    fn new(name: &str) -> Self {}
    fn show(&self) {}
}

impl Trait for FooPlus {
    fn show(&self) {}
    fn new(name: &str, lvl: i128) -> Self {}
}

您可以使额外参数成为特征的 associated type

trait Trait {
  type ConstructParam
  fn show(&self);
  fn new(name: &str, arg: ConstructParam) -> Self;
}

impl Trait for Foo {
  type ConstructParam = ();
  fn show(&self) { ... }
  fn new(name: &str, arg: ()) -> Self { ... }
}

impl Trait for FooPlus {
  type ConstructParam = i128;
  fn show(&self) { ... }
  fn new(name: &str, arg: i128) -> Self { ... }
}

请注意,您必须使用额外的单位参数调用“no-argument”构造函数,因此 Foo::new("example name", ()),但该单位参数是 zero-sized,因此几乎肯定会被优化什么都没有。

不过,正如评论中已经提到的,具有 new 的特征很奇怪。您打算多态性 对通用类型调用new 的频率是多少?如果您真的需要以多态方式生成实例,这听起来像是 factory pattern 的应用,不是以这种方式很好地使用特征。而且,如果您不是以多态方式进行操作,则只需将 new 作为 FooFooPlusimpl 的一部分。