rust - 如何实现分层特征?
问题描述
我在层次结构中有两个特征:Animal
和Bird
. 我怎样才能创建一个Chicken
实现Bird
?
trait Animal {
fn noise(&self) -> String;
fn print_noise(&self) {
print!("{}", self.noise());
}
}
trait Bird: Animal {
fn noise(&self) -> String {
"chirp"
}
}
struct Chicken {}
impl Bird for Chicken {}
当我尝试编译时,我得到:
error[E0277]: the trait bound `Chicken: Animal` is not satisfied
--> src/lib.rs:16:6
|
16 | impl Bird for Chicken {}
| ^^^^ the trait `Animal` is not implemented for `Chicken`
我不想在Animal
之前实现Bird
,因为我Chicken
想noise
从Bird
.
解决方案
简单的答案:你不能。Rust 没有设计继承。Rust 没有与 Java 或 C++ 相同的面向对象模型。
如果你真的想做这样的事情,你可以用这段代码实现一个特征
trait Animal {
fn noise(&self) -> String;
fn print_noise(&self) {
print!("{}", self.noise());
}
}
trait Bird:Animal {}
impl<T: Bird> Animal for T {
fn noise(&self) -> String {
"chirp".to_string()
}
}
struct Chicken {}
impl Bird for Chicken {}
fn main() {
let chicken = Chicken{};
chicken.print_noise();
}
和其他人一样,我建议阅读The Rust Programming Language一书,特别是OOP和Traits 和 Generics部分。在线阅读时是免费的。
推荐阅读
- go - 在 Visual Studio 代码中调试 cgo 会产生“多重定义”错误
- python - 绘制 n 次函数的图形
- java - Kafka Consumer - 从每个分区读取 2000 条 LATEST 消息
- c++ - 为什么将一个指针分配给另一个指针会改变 cpp 中的原始指针?
- swift - 从 anyObject 到坐标数组
- office-js - Outlook 加载项可操作消息“Action.InvokeAddInCommand”在 OWA 中没有模式
- amazon-web-services - EMR 集群卡在调整大小上
- ansible - 如何通过索引生成器结果中的列表来选择 1 项?
- mlt - MLT XML:为输入数据指定编解码器
- c# - 简单的 Injector 构造函数参数