如何在派生 classes 中共享方法而不包含在基础 class 中
How to share methods in derived classes without including in base class
我有一个 class BinarySearchTree
,由 AVLTree
和 RedBlackTree
扩展。两个派生的classes支持旋转因此需要使用rotateLeft
和rotateRight
方法。一种方法是在BinarySearchTree
中实现这两个方法,使它们对AVLTree
和RedBlackTree
可用,但是这些方法不属于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
,让它定义受保护的方法 rotateLeft
和 rotateRight
,然后有 AVLTree
和 RedBlackTree
从 RotatableBinarySearchTree 而不是 BinarySearchTree 扩展。
这满足了您在 class 之间共享具体实现的目标,而无需将代码添加到 BinarySearchTree,BinarySearchTree 本身是不可旋转的。如果您使用 Rotatable
接口,那么您将不得不在两个子 class 中复制逻辑,或者使用某种注入,在我看来对于这种情况来说这似乎不必要地复杂。
如果您不熟悉抽象 classes,请参阅史蒂夫在评论中分享的 link。
我有一个 class BinarySearchTree
,由 AVLTree
和 RedBlackTree
扩展。两个派生的classes支持旋转因此需要使用rotateLeft
和rotateRight
方法。一种方法是在BinarySearchTree
中实现这两个方法,使它们对AVLTree
和RedBlackTree
可用,但是这些方法不属于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
,让它定义受保护的方法 rotateLeft
和 rotateRight
,然后有 AVLTree
和 RedBlackTree
从 RotatableBinarySearchTree 而不是 BinarySearchTree 扩展。
这满足了您在 class 之间共享具体实现的目标,而无需将代码添加到 BinarySearchTree,BinarySearchTree 本身是不可旋转的。如果您使用 Rotatable
接口,那么您将不得不在两个子 class 中复制逻辑,或者使用某种注入,在我看来对于这种情况来说这似乎不必要地复杂。
如果您不熟悉抽象 classes,请参阅史蒂夫在评论中分享的 link。