2012-04-27 18 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関数に機能を追加する必要があります。既存のコードを書き直す必要はありません。つまり、元のadd()関数を呼び出す必要があります。

edit: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. 追加機能
  2. を実装し、元の再帰 add()
  3. を使用して値を追加します。
+0

保護されたメソッドの名前を変更します。 –

+0

再帰呼び出しをオーバーライドする理由は何ですか? –

+3

問題はありません...それはまさにそれがやろうとしていることです。 ;) –

答えて

2

パラメータが表示されていない場合は、void add(...)がツリーに何かを追加する方法ですが、保護された再帰的メソッドは追加するノードを探して追加を実行します。

さらに、パブリック非再帰的メソッドはツリーのルートを開始パラメータとしてツリーのルートに渡し、再帰的メソッドはリーフをヒットするまで左または右の子を渡します。したがって、非再帰的メソッドを呼び出すと、何度もルートから開始される可能性があります。

したがって、私は、再帰的と継承されたメソッドが非再帰バージョンを呼び出すべきではないと言うだろうが、再び自分自身を呼び出す必要があります。

+0

あなたの答えは正確には解決策ではありませんが、それは私がどこかでメソッドの呼び出しでミスを犯す可能性があると私に思ったと私は思います。ありがとう^ __ ^ – devjeetroy

1

これは無作為で、あまり意味がないかもしれません。あなたのコメントで

、それはあなたのTree.addは再帰的である、とSTree.addが再帰的であることを言う:

はちょうどその原料を行い、再帰しない、保護された方法Tree.addCommon(..)を作成します。行う必要があります。

Tree.add(..)は、再帰する(..)addCommon(..)を呼び出し、その後this.add。

STree.add(..)は、それは、余分なものだ一般的なもののためsuper.addCommon(..)を呼び出し、その後、this.add(..)が再帰しません。

私は知っています。疑似コードを書かなければならない。レイジー。

+0

返事をありがとう。私は自分の投稿を編集しました。私はとにかくTreeクラスを変更することはできません。私はStreeクラスでヘルパーメソッドを使用することができますが、元の再帰的なaddをオーバーライドする必要があるadd関数を使用してそれを行う必要があります。申し訳ありませんが質問が不明だった場合 – devjeetroy

0

クラスを変更できない場合はおそらくそうではありません。 しかし、私は最良の解決策はaddHelper(...)という別のメソッドを作成し、再帰の責任を負うと思い、add(...)メソッドの内部でこのヘルパーを呼び出します。