2016-05-03 135 views
0

我正在尋找處理細微問題的清晰且正確的方法。 Technicaly是的,我可以簡單地忽略它,但這不是重點。通過繼承更改方法參數

我有一個BinaryTree類,它利用Node類型的對象。 BinaryTree類有一個方法addNode(Node n),它根據二叉樹的規則添加一個新節點

現在我想創建一個RedBlackTree類,該類使用RedBlackNode類型的對象(Node有一個額外的顏色字段)並從BinaryTree繼承。我不應該離開addNode方法,因爲它允許將正常的節點添加到RedBlackTree,導致錯誤。我可以像這樣超載的方法:

class RedBlackTree extends BinaryTree 
{ 
    public void addNode(RedBlackNode n) 
    { 
     ... 
    } 
} 

但其他方法仍然是暴露的,理想情況下,它不應該是。 我可以覆蓋這樣的方法:

但隨後的方法仍然需要一個正常的節點作爲參數,並且理想地應該只接受RedBlackNode(當他試圖使用方法也可能混淆別人)。

我想要的是繼承addNode方法,使參數類型從Node更改爲RedBlackNode。我怎麼做?這甚至可能嗎?或者這是我的一個概念性問題?

+5

爲什麼不簡單地使用泛型?我認爲這種情況是他們被添加到語言中的。 –

+0

非常正確:class BinaryTree 類RedBlackTree擴展了BinaryTree Ironcache

回答

1

你可以去像下面這樣:

class BinaryTree<E extends Node>{ 
    public void add(E e){ 
    } 
} 

class RedBlackTree extends BinaryTree<RedBlackNode>{ 
    @Override 
    public void add(RedBlackNode e) { 
    } 
} 

然後你就可以通過任一節點到您的二叉樹,但只有特定的節點到您的RedBlackTree