繁体   English   中英

如何在派生类中共享方法而不包含基类

[英]How to share methods in derived classes without including in base class

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

定义一个名为“ Rotatable”的接口,并让您的子类实现从基础类扩展的功能

创建一个中间类abstract class RotatableBinarySearchTree extends BinarySearchTree ,让其定义受保护的方法rotateLeftrotateRight ,然后使AVLTreeRedBlackTreeAVLTree而不是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM