2012-04-27 123 views
3

我有一個超類和子類,如下所示: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; 
    } 

編輯:現在,我看,這是預期的行爲,我怎麼去實現如下:

  1. 使用原始遞歸add()
  2. 添加值實現額外的功能
+0

更改受保護方法的名稱 – 2012-04-27 19:57:58

+0

爲什麼重寫遞歸調用? – 2012-04-27 19:58:54

+3

沒有問題......這正是它應該做的。 ;) – 2012-04-27 19:58:58

回答

2

沒有看到參數,我假設void add(...)是向樹中添加內容的方法,而受保護的遞歸方法查找要添加到的節點,然後執行添加。

我進一步假設公共非遞歸方法將樹的根作爲開始參數傳遞給遞歸方法,而遞歸方法則將左側或右側子項傳遞給您,直到您擊中葉子爲止。因此調用非遞歸方法可能會一次又一次地從根開始。

因此,我會說,遞歸和繼承方法不應該調用非遞歸版本,但應該再次調用自己。

+0

嘿,儘管你的答案不完全是解決方案,但它讓我覺得我可能在方法調用的某個地方犯了一個錯誤,我猜我是。謝謝^ __ ^ – devjeetroy 2012-04-27 20:13:55

1

好的。這是隨機的,可能沒有多大意義。

在你的評論,它說你的Tree.add是遞歸的,而且STree.add是遞歸的:

創建受保護的方法Tree.addCommon(..),它不遞歸,只是做的東西,需要完成。 (..)調用addCommon(..),然後this.add(..)進行遞歸。 (..)是否是額外的東西,爲普通的東西調用super.addCommon(..),然後調用this.add(..)來進行遞歸。

我知道。應該編寫僞代碼。懶。

+0

感謝您的回覆。我編輯了我的帖子。無論如何,我無法修改Tree類。我必須使用必須重寫原始遞歸添加的add函數來完成它,儘管我可以在Stree類中使用helper方法。對不起,如果問題不清楚 – devjeetroy 2012-04-27 20:07:38

0

也許不是這種情況,如果你不能修改類。 但我認爲最好的解決方案是創建另一個稱爲addHelper(...)的方法,它將負責遞歸,然後在add(...)方法內調用此輔助方法。