如何用自己类型的成员扩展 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> {
}