2012-09-12 28 views
1
public class Node { 
    public Node right; 
} 

public class SpecialNode extends Node { 
    public String specialLabel; 
} 

public class Testmain { 
    public static void main(String[] args) { 
    Node n1 = new Node(); 
    Node n2 = new Node(); 
    Node n3 = new Node(); 
    n1.right=n2; 
    n2.right=n3; 

    // some calculations --> now n2 has to become a SpecialNode, how ??? 
    } 
} 

我正在實現一個鏈接列表與節點,其中每個節點都知道它的右邊的鄰居。我創建了一個列表:節點n1->節點n2->節點n3。創建列表後,它只包含Node類型的元素。現在我想告訴節點n2是一個特殊節點,以便提供一個specialLabel。 downcast之後,列表應該看起來像Node n1-> SpecialNode n2-> Node n3。 這怎麼辦?從超類下降:節點到特殊節點在鏈表

(請注意,N2不知道它的左鄰,而且請注意,我要告訴N2是列表的創建經過特殊所以初始化它作爲超類的節點後,因爲我需要做出決定之前必須做一些計算哪個節點將是特別的。)

回答

3

你不能說n2是一個SpecialNode,因爲它從來沒有被

我認爲你最好用一個新的SpecialNode實例替換現有的n2。如果n2取代自身(如果它知道它在列表中的位置),或者失敗,至少會給你一個SpecialNode的新實例,這將是一個好方法。在這種情況下,您必須手動將其連接到n1

SpecialNode sn = n2.toSpecialNode(); 
+0

更換''N2與'SpecialNode'是不是我的選擇一個新的實例,我將不得不尋找它的左鄰設置'right'屬性的新實例,並刪除舊的節點類型'節點'。搜索左邊的鄰居從該列表的頭部開始。但是我的列表中有3個以上的節點(如下例),我在這個列表中有數千個元素,我甚至簡化了這個問題,實際上我在樹中有節點。放置新電線將非常耗時。 – user1665066

0

這是我如何解決它。最後,感謝您的向下轉換不會工作了答案,我的解決方案是接近行爲的thingie @Andrew。我不使用Node本身的繼承,而是爲它所包含的數據使用繼承。就像那個Node就像一個容器一樣工作,我把我的電線保持在正確的位置上。代替擴展SpecialNode,我爲節點引用NodeData創建了一個屬性。 NodeDataNodeDataSpecial擴展,所以節點可以攜帶特殊內容。

public class Node { 
    public Node right; 
    public NodeData; 
} 

public class NodeData { 
} 

public class SpecialNodeData extends NodeData { 
    public String specialLabel; 
}