[英]How to share methods in derived classes without including in base class
我有一个类BinarySearchTree
,它由AVLTree
和RedBlackTree
扩展。 这两个派生类支持旋转,因此需要使用rotateLeft
和rotateRight
方法。 一种方法是在BinarySearchTree
实现这两个方法,以便AVLTree
和RedBlackTree
可以使用它们,但是这些方法不属于BinarySearchTree
因为它不支持旋转。 我应该如何用Java处理这种情况?
定义一个名为“ Rotatable”的接口,并让您的子类实现从基础类扩展的功能
创建一个中间类abstract class RotatableBinarySearchTree extends BinarySearchTree
,让其定义受保护的方法rotateLeft
和rotateRight
,然后使AVLTree
和RedBlackTree
从AVLTree
而不是BinarySearchTree扩展。
这满足了您在类之间共享具体实现的目标,而不必将代码添加到BinarySearchTree中,后者本身是不可旋转的。 如果使用Rotatable
接口,则必须在两个子类中都复制逻辑,或者使用某种注入,在我看来,这种注入对于这种情况来说不必要地复杂。
如果您不熟悉抽象类,请参阅Steve在注释中共享的链接。
创建一个具有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
}
}
定义一个包含这两种方法的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,否则必须分别重复地在子类中实现方法。 (仅在界面中定义了它们的原型)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.