两个结构继承一个特征,但有额外的参数
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
作为 Foo
和 FooPlus
的 impl
的一部分。
如何让两个结构继承一个特征,但有额外的参数?
而且我听说不建议在 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
作为 Foo
和 FooPlus
的 impl
的一部分。