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

时间:2015-01-03 15:06:36

标签: java inheritance design-patterns

我有一个BinarySearchTree课,AVLTreeRedBlackTree。两个派生类支持循环,因此需要使用rotateLeftrotateRight方法。一种方法是在BinarySearchTree中实现这两种方法,以便AVLTreeRedBlackTree可以使用这些方法,但这些方法不属于BinarySearchTree,因为它不支持轮换因此。我该如何处理Java中的这种情况?

4 个答案:

答案 0 :(得分:1)

定义一个名为eg的接口“可旋转”,并使您的子类实现除了从基类扩展

之外

答案 1 :(得分:1)

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

这符合您在类之间共享具体实现的目标,而无需将代码添加到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,否则必须分别重复地实现子类中的方法。 (只有他们的原型在界面中定义)