如何解决在不将新特征定义为核心组件的情况下,为树的节点实现新特征
我有一个模块,其中一些节点形成一棵树。每个节点都实现特征Node
,每个非叶节点都有一些Node
特征对象作为子代。其他模块定义了新的节点类型。
在第二个模块中,我想引入一个新特性NewTrait
并尽可能多地为Node的实现者实现它。对于未实现它的节点,它可以具有默认实现。
我不知道如何从孩子那里得到NewTrait
。这是因为即使我有一个类型为T: Node+NewTrait
的对象,它的子对象也只会是Node
。我认为,无法动态获得NewTrait
特征对象(link)的Node
实现。
有什么方法可以实现我想要的功能,而不必将NewTrait
合并到第一个模块中并使其成为Node
的特征吗?我宁愿更改树和节点的整体结构,以防其他设计可行。我可以使用每晚和不安全的方式。
。
编辑:最小的,可重复的示例
我有这个tree_mod
模块,其中定义了Node
特征和一些节点:
mod tree_mod {
pub trait Node {}
pub struct OrNode {
pub children : Vec<Box<dyn Node>>
}
impl Node for OrNode {}
pub struct AndNode {
pub children : Vec<Box<dyn Node>>
}
impl Node for AndNode {}
pub struct NotNode {
pub child: Box<dyn Node>
}
impl Node for NotNode {}
pub struct I32Node {
pub num : i32
}
impl Node for I32Node {}
pub struct DoubleNode {
pub num : double
}
impl Node for DoubleNode {}
}
在第二个模块prettiness_mod
中,我想介绍新的特征Pretty
,以告诉我们节点是否漂亮。默认情况下,所有节点都是漂亮的,但是有些节点可能具有不同的行为。
我想做类似的事情:
mod prettiness_mod {
use crate::tree_mod::*;
pub trait Pretty {
fn is_pretty(&self) -> bool {
true // by default,self is pretty
}
}
impl Pretty for OrNode {
fn is_pretty(&self) -> bool {
self.children.iter().any(|&node| node.is_pretty())
}
}
impl Pretty for AndNode {
fn is_pretty(&self) -> bool {
self.children.iter().all(|&node| node.is_pretty())
}
}
impl Pretty for NotNode {
fn is_pretty(&self) -> bool {
! self.child.is_pretty()
}
}
impl Pretty for DoubleNode {
fn is_pretty(&self) -> bool {
false
}
}
}
我不知道该怎么做,因为我要实现的节点Pretty
的子节点仅实现Node
而不是Pretty
。
我可以执行以下操作,但是随后我无法专门化任何节点的行为:
impl<T> Pretty for T where T: Node {
fn is_pretty(&self) -> bool {
true
}
}
是否可以实现我希望的而不必使Pretty
成为Node
的特征/组成部分?我想将Pretty
及其相关的所有内容都保留在tree_mod
之外。
我正在寻找一种方法或模式来定义异构节点的树,以使其将来的行为可由其他模块扩展。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。