我有一個超類和子類,如下所示:Java繼承和遞歸
class Tree{
..
public void add(..){
//makes a call to protected function add(..)
}//for client to use.
protected TreeNode add(..){}//recursive function which calls itslef
}
class Stree extends Tree{
//overrides the recursive add function from class Tree
protected TreeNode add(..){
..
super.add();//calls the non-recursive add function in superclass.
}
}
這裏的問題是,當我在子類中調用super.add()
來自新增加的功能,它進入Tree.add()
。裏面Tree.add()
。有一個調用add()
,它調用子類中的遞歸添加函數而不是超級,即Stree.add()
,而不是Tree.add()
,這會導致無限循環。你們看到問題在哪裏嗎?
這是一項家庭作業,因此我無法更改遞歸函數的名稱。我明確要求爲遞歸添加功能添加功能,而不重寫任何現有的代碼,這基本上意味着我將不得不打電話給原始的add()
函數。
編輯:Tree.add()的代碼//遞歸。請注意,我無法修改此代碼以獲得我尋求的功能。
protected StreeNode add(StreeNode node, String value) {
if (node == null) {
node = new StreeNode(value);
numElements++;
} else if (node.data.compareTo(value) == 0) {
// do nothing, String was already in Set
} else if (node.data.compareTo(value) > 0) {
node.left = add(node.left, value); // x = change(x)
} else {
node.right = add(node.right, value); // x = change(x)
}
return node;
}
編輯:現在,我看,這是預期的行爲,我怎麼去實現如下:
- 使用原始遞歸
add()
- 添加值實現額外的功能
更改受保護方法的名稱 – 2012-04-27 19:57:58
爲什麼重寫遞歸調用? – 2012-04-27 19:58:54
沒有問題......這正是它應該做的。 ;) – 2012-04-27 19:58:58