如何在派生 classes 中共享方法而不包含在基础 class 中

How to share methods in derived classes without including in base class

我有一个 class BinarySearchTree,由 AVLTreeRedBlackTree 扩展。两个派生的classes支持旋转因此需要使用rotateLeftrotateRight方法。一种方法是在BinarySearchTree中实现这两个方法,使它们对AVLTreeRedBlackTree可用,但是这些方法不属于BinarySearchTree,因为它不支持旋转像这样。我应该如何在 Java 中处理这种情况?

定义一个接口,例如"Rotatable",并让你的子 classes 除了从基础 class

扩展之外实现它

创建一个新的接口,比如具有这两个方法的 RotatingTree,在 class 中实现它,并在运行时将它注入到你的 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,并在子 class 中实现它们。注意事项如下:

 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.

因为一个class只能继承一个class,除非你想在classBinarySearchTree中定义rotateLeft和rotateRight,否则你必须实现子类中的方法class 分别重复。 (接口中只定义了它们的原型)

创建一个中间体 class abstract class RotatableBinarySearchTree extends BinarySearchTree,让它定义受保护的方法 rotateLeftrotateRight,然后有 AVLTreeRedBlackTree从 RotatableBinarySearchTree 而不是 BinarySearchTree 扩展。

这满足了您在 class 之间共享具体实现的目标,而无需将代码添加到 BinarySearchTree,BinarySearchTree 本身是不可旋转的。如果您使用 Rotatable 接口,那么您将不得不在两个子 class 中复制逻辑,或者使用某种注入,在我看来对于这种情况来说这似乎不必要地复杂。

如果您不熟悉抽象 classes,请参阅史蒂夫在评论中分享的 link。