【发布时间】:2019-03-01 22:23:57
【问题描述】:
我有一个超类和一个子类如下:
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()的调用,它调用子类中的递归添加函数而不是super,即Stree.add(),而不是Tree.add(),这会导致无限循环。各位看出来问题出在哪里了吗?
这是一个家庭作业,因此我无法更改递归函数的名称。明确要求我向递归添加函数添加功能,而不重写任何现有代码,这基本上意味着我将不得不调用原始的 add() 函数。
编辑:Tree.add()//recursive 的代码。请注意,我无法修改此代码以获得我所寻求的功能。
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()添加值 - 实现额外功能
【问题讨论】:
-
更改受保护方法的名称
-
你为什么要覆盖递归调用?
-
没问题……这正是它应该做的。 ;)
-
不幸的是我不能这样做。方法名称需要保持不变。
-
这是预期的行为..为什么不能更改方法名称?
标签: java inheritance recursion