微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在不将新特征定义为核心组件的情况下,为树的节点实现新特征

如何解决在不将新特征定义为核心组件的情况下,为树的节点实现新特征

我有一个模块,其中一些节点形成一棵树。每个节点都实现特征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 举报,一经查实,本站将立刻删除。