Design patterns 空模式和复合模式don';我们不能在一起玩得很好

Design patterns 空模式和复合模式don';我们不能在一起玩得很好,design-patterns,composite,null-object-pattern,Design Patterns,Composite,Null Object Pattern,在这个复合树中,我保留了对父节点的引用,以便灵活地进行树遍历。我不想一直检查父节点是否有空引用,但是如果我创建一个NullNode类并将每个节点的父节点初始化为空,我会得到一个堆栈溢出,因为NullNode有一个NullNode有一个NullNode有一个NullNode有一个。。。。无限远 我已经尝试将NullNode的父节点设置为null,但是仍然必须对父节点执行null引用检查,这似乎不符合目的。 有人碰到这个吗?如果能做点什么呢 谢谢 反例(极端伪代码): 如果我创建一个NullNode

在这个复合树中,我保留了对父节点的引用,以便灵活地进行树遍历。我不想一直检查父节点是否有空引用,但是如果我创建一个NullNode类并将每个节点的父节点初始化为空,我会得到一个堆栈溢出,因为NullNode有一个NullNode有一个NullNode有一个NullNode有一个。。。。无限远 我已经尝试将NullNode的父节点设置为null,但是仍然必须对父节点执行null引用检查,这似乎不符合目的。 有人碰到这个吗?如果能做点什么呢

谢谢

反例(极端伪代码):

如果我创建一个NullNode类并初始化每个节点的父节点,我会得到一个堆栈溢出,因为NullNode有一个NullNode有一个NullNode有一个。。。。无限期地,我尝试将NullNode的父节点设置为null,但仍然必须对父节点执行null引用检查,这似乎无法达到目的。有人碰到这个吗

您的
NullNode
实际上不需要包含另一个
NullNode
作为父节点。只需在
NullNode
中实现
getParent()
(或您调用它的任何名称),即可返回
this
self
或您语言中的任何含义

但是,这可能仍然是一个坏主意,因为您必须在某个点停止遍历。上面的内容可以让您通过构造函数递归,但是树没有根,因为它是一路向上的null节点,或者一路向下的turtles等等


如果您实际显示代码,即使代码不起作用,并且稍微描述一下您的使用计划,那么这一切都会更容易讨论。

您的遍历函数是如何工作的?你需要停下来吗?您需要发布一些代码,因为您的问题似乎无效。我甚至都没有足够的距离来搜索树。堆栈溢出发生在构造NullNode的过程中,因为它包含初始化为NullNode的父节点。NullNode当然应该根本没有父节点。请参阅下面的第二个答案和伪代码。
class NullNode(): Component{
   public NullNode(){

   }
    public something SearchUp(){
       return null;
    }
}

class Node: Component{
   public Node(t){
       this.parent = NullNode();
   }
    public void SetParent(Component parent){
       this.parent = parent;
    }
    public something SearchUp(){
      return self.parent.SearchUp();
    }
  }

abstract class Component{
    Component parent

    public Component(){
    }
    public something SearchUp();
 }