我有一个BinarySearchTree
课,AVLTree
和RedBlackTree
。两个派生类支持循环,因此需要使用rotateLeft
和rotateRight
方法。一种方法是在BinarySearchTree
中实现这两种方法,以便AVLTree
和RedBlackTree
可以使用这些方法,但这些方法不属于BinarySearchTree
,因为它不支持轮换因此。我该如何处理Java中的这种情况?
答案 0 :(得分:1)
定义一个名为eg的接口“可旋转”,并使您的子类实现除了从基类扩展
之外答案 1 :(得分:1)
创建一个中级类abstract class RotatableBinarySearchTree extends BinarySearchTree
,让它定义受保护的方法rotateLeft
和rotateRight
,然后从RotatableBinarySearchTree而不是BinarySearchTree扩展AVLTree
和RedBlackTree
这符合您在类之间共享具体实现的目标,而无需将代码添加到BinarySearchTree,而BinarySearchTree本身不可旋转。如果你使用Rotatable
接口,那么你将不得不复制两个子类中的逻辑,或者使用某种注入,这对我来说似乎是不必要的复杂。
如果您不熟悉抽象类,请参阅Steve在评论中分享的链接。
答案 2 :(得分:0)
创建一个新的接口说RotatingTree有这两种方法,在类中实现它并在运行时将它注入到AvlTree或RedBlackTree中。
class BinarySearchTree<T> {
public void add(T element) {}
}
class RedBlackTree extends BinarySearchTree {
private RotatingTree rotationPolicy;
public AVLTree (RotatingTree rotationPolicy) {
this.rotationPolicy = rotationPolicy;
}
public void add(T element) {
rotationPolicy.rotateLeft();//...and so on
}
}
class AVLTree extends BinarySearchTree {
private RotatingTree rotationPolicy;
public AVLTree (RotatingTree rotationPolicy) {
this.rotationPolicy = rotationPolicy;
}
public void add(T element) {
rotationPolicy.rotateRight();//...and so on
}
}
答案 3 :(得分:0)
定义包含这两种方法的interface
,并在子类中实现它们。以下是警告:
A Java interface is just like an abstract class, except for two differences.
(1) In Java, a class can inherit from only one class, even if the superclass
is an abstract class. However, a class can "implement" (inherit from) as
many Java interfaces as you like.
(2) A Java interface cannot implement any methods, nor can it include any
fields except "final static" constants. It only contains method
prototypes and constants.
因为类只能从一个类继承,除非你想在BinarySearchTree类中定义rotateLeft和rotateRight,否则必须分别重复地实现子类中的方法。 (只有他们的原型在界面中定义)