次のように私はスーパークラスとサブクラスを持っている: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;
}
編集:今、私は、これは正常な動作であることを確認することを、どのように私は次のことを達成して行くん:
- 追加機能 を実装し、元の再帰
- を使用して値を追加します。
add()
保護されたメソッドの名前を変更します。 –
再帰呼び出しをオーバーライドする理由は何ですか? –
問題はありません...それはまさにそれがやろうとしていることです。 ;) –