如何用自己类型的成员扩展 class?
How to extend a class with a member of its own type?
假设我们需要用一个名为 "BaseNode" 的 class 实现不同类型的树,从中派生出其他类型的节点,并且它假设有一个名为 parent
的实例变量它自己的类型,一般看起来像:
class BaseNode{
//...some fields
BaseNode parent;
//...other methods
}
现在,如果我要为具有更多成员的 AVL 树派生节点:
class AVLNode extends BaseNode{
//...other useful stuff
}
原始的 parent
(&left
&right
) 节点成员仍然是 BaseNode
类型,这阻止了我实现 AVL 树。
谁能告诉我如何解决这个继承问题?
谢谢!
解决方案 1 - 任何时候访问 parent
,将其转换为 (AVLNode) parent
。您可以在 AVLNode
中编写访问器以使其更方便。
class AVLNode extends BaseNode {
public AVLNode getParent() {
return (AVLNode) parent;
}
}
解决方案 2 - 使 BaseNode
成为通用的 class,将 subclass 作为参数。现在 parent
可以是所需的确切类型。
class BaseNode<T extends BaseNode<T>> {
T parent;
}
class AVLNode extends BaseNode<AVLNode> {
}
假设我们需要用一个名为 "BaseNode" 的 class 实现不同类型的树,从中派生出其他类型的节点,并且它假设有一个名为 parent
的实例变量它自己的类型,一般看起来像:
class BaseNode{
//...some fields
BaseNode parent;
//...other methods
}
现在,如果我要为具有更多成员的 AVL 树派生节点:
class AVLNode extends BaseNode{
//...other useful stuff
}
原始的 parent
(&left
&right
) 节点成员仍然是 BaseNode
类型,这阻止了我实现 AVL 树。
谁能告诉我如何解决这个继承问题?
谢谢!
解决方案 1 - 任何时候访问 parent
,将其转换为 (AVLNode) parent
。您可以在 AVLNode
中编写访问器以使其更方便。
class AVLNode extends BaseNode {
public AVLNode getParent() {
return (AVLNode) parent;
}
}
解决方案 2 - 使 BaseNode
成为通用的 class,将 subclass 作为参数。现在 parent
可以是所需的确切类型。
class BaseNode<T extends BaseNode<T>> {
T parent;
}
class AVLNode extends BaseNode<AVLNode> {
}