在這個複合樹中,我保留了用於靈活樹遍歷的父節點的引用。我不想一直檢查父對象是否爲空引用,但是如果我創建一個NullNode類並初始化每個節點的父對象,我會得到一個堆棧溢出,因爲NullNode有一個NullNode有一個NullNode有一個.. .. ad infinitum 我試着將NullNode的父項設置爲null,但是我仍然必須爲父項執行空引用檢查,這似乎是擊敗了目的。 有誰遇到過這個?什麼,如果有什麼可以做的?null模式和複合模式在一起玩並不好
謝謝!
在這個複合樹中,我保留了用於靈活樹遍歷的父節點的引用。我不想一直檢查父對象是否爲空引用,但是如果我創建一個NullNode類並初始化每個節點的父對象,我會得到一個堆棧溢出,因爲NullNode有一個NullNode有一個NullNode有一個.. .. ad infinitum 我試着將NullNode的父項設置爲null,但是我仍然必須爲父項執行空引用檢查,這似乎是擊敗了目的。 有誰遇到過這個?什麼,如果有什麼可以做的?null模式和複合模式在一起玩並不好
謝謝!
,如果我做一個NullNode類和每個節點的父節點初始化到這一點,我得到一個堆棧溢出,因爲NullNode有NullNode有一個NullNode有.... ad infinitum我試着將NullNode的父項設置爲null,但是我仍然必須爲父項執行空引用檢查,這似乎違背了目的。任何人遇到這個?
您的NullNode
不需要實際包含另一個NullNode
作爲父母。只需執行getParent()
NullNode
(或任何你稱之爲)返回this
或self
或任何意味着你的語言。
但是,這可能仍然是一個壞主意,因爲你必須在某個點停止遍歷。上面的代碼讓你瞭解了構造函數的遞歸過程,但是沒有樹的根,因爲它一直是NullNodes或者烏龜或者類似的東西。
如果你真的顯示代碼,即使它沒有工作,並且稍微描述一下你的使用計劃,這將會更容易討論。
反例(極端的僞代碼):
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();
}
你的遍歷函數是如何工作的?你需要停下來?你需要發佈一些代碼,因爲你的問題似乎並不合適。 – Nix
我甚至從來沒有足夠多的搜索樹。堆棧溢出發生在NullNode的構造過程中,因爲它包含一個初始化爲NullNode的父代。 – krakencalamari
NullNode當然應該沒有父母。使用僞代碼查看下面的第二個答案。 –