Java-使用继承原始参数的参数重写方法
我有一个二叉搜索树的类:Java-使用继承原始参数的参数重写方法,java,oop,overriding,binary-search-tree,avl-tree,Java,Oop,Overriding,Binary Search Tree,Avl Tree,我有一个二叉搜索树的类: class BSTree<T> { ... protected void insert(BSNode<T> parent, int side, BSNode<T> child){ ... // Binary tree insertion logic } public void add(T data){ ...
class BSTree<T> {
...
protected void insert(BSNode<T> parent, int side, BSNode<T> child){
... // Binary tree insertion logic
}
public void add(T data){
...
parent, side, child = search(data) // this line is pseudo code
insert(parent, side, child) // instance insertion logic
}
...
}
我的问题是:
我希望AVLTree
中的insert()
方法覆盖BSTree
中的insert()
方法,以便从add()
中调用时,将根据对象的类调用正确的方法
如何从
AVLTree
中的BSTree
类重写方法insert
,以AVLNode
s作为参数?不能用具有不同签名的另一个方法重写方法。因此,您不能使用smth覆盖受保护的void insert(BSNode parent,int-side,BSNode child)
,比如受保护的void insert(AVLNode parent,int-side,BSNode child)
,您必须将实现作为类型参数提供(如果节点是内部类,则必须使用AVLTree.AVLNode)
类AVLTree扩展了BSTree{
受保护的空插入(AVLNode父节点、int侧、AVLNode子节点){
...
}
...
}
及
classbstree{
受保护的空插入(T_节点父节点、int端、T_节点子节点){
...
}
...
}
只要是像T这样的类型变量,任何名称都是有效的,但在我看来,如果是像“Node”这样的代码,代码的可读性更高。按照惯例,它应该只有一个大写字母。Javadocs的存在是为了解释泛型类型的含义:PI-know,但在本例中,我更喜欢有意义的名称,而不是像N这样的单字母名称(为了更符合约定,可以使用全超级名称,即T_节点(像T_PRED等名称通常在java类中使用))。例如,java.util.Spliterator.OfPrimitive使用T_CONS和T_SPLITR。类型参数名称的约定是使用单个大写字母。使用长名称可能会让真正遵守行业标准命名约定的人感到困惑,因为长名称看起来像其他类型的名称,而不是类型参数。最好抛开个人的特殊理由,做对整个社区有用的事情。没有人是孤岛。不要问钟声为谁而鸣;它为你而鸣。
class AVLTree extends BSTree<Integer>{
...
/* overrides BSTree insert() with slightly different parameters,
which inherit from the parameters of the BSTree insert() method */
protected void insert(AVLNode parent, int side, AVLNode child){
... // AVL tree insertion logic
}
...
}
class AVLTree extends BSTree<Integer, AVLNode> {
protected void insert(AVLNode parent, int side, AVLNode child) {
...
}
...
}
class BSTree<T, T_NODE extends BSNode<T>> {
protected void insert(T_NODE parent, int side, T_NODE child) {
...
}
...
}