次のようなスーパークラスとサブクラスがあります。
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()
、サブクラスの新しい add 関数から呼び出すと、 Tree.add()
. 内部Tree.add()
。への呼び出しがありadd()
、スーパーの代わりにサブクラスで再帰的な add 関数を呼び出します。つまりStree.add()
、代わりにTree.add()
、無限ループが発生します。問題がどこにあるかわかりますか?
これは宿題なので、再帰関数の名前を変更することはできません。既存のコードを書き直すことなく、再帰的な 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()
- 追加機能を実装する