Java 如何使用自己类型的成员扩展类?

Java 如何使用自己类型的成员扩展类?,java,class,oop,inheritance,extends,Java,Class,Oop,Inheritance,Extends,假设我们需要用一个名为“BaseNode”的类来实现不同类型的树,其他类型的节点从该类派生而来,并且假设它有一个名为parent的实例变量,其类型通常如下所示: class BaseNode{ //...some fields BaseNode parent; //...other methods } 现在,如果我要为具有更多成员的AVL树派生节点: class AVLNode extends BaseNode{ //...other useful stuff }

假设我们需要用一个名为“BaseNode”的类来实现不同类型的树,其他类型的节点从该类派生而来,并且假设它有一个名为
parent
的实例变量,其类型通常如下所示:

class BaseNode{
   //...some fields
   BaseNode parent;
   //...other methods
}
现在,如果我要为具有更多成员的AVL树派生节点:

class AVLNode extends BaseNode{
    //...other useful stuff

}
原始的
parent
(&
left
&
right
)节点成员仍然是
BaseNode
类型,这使我无法实现AVL树。 谁能告诉我如何解决这个继承问题?
谢谢

解决方案1-任何时候访问
父级
,将其强制转换为
(AVLNode)父级
。您可以在
AVLNode
中编写一个访问器,使其更加方便

class AVLNode extends BaseNode {
    public AVLNode getParent() {
        return (AVLNode) parent;
    }
}
解决方案2-使
BaseNode
成为以子类为参数的泛型类。现在,
parent
可以是所需的确切类型

class BaseNode<T extends BaseNode<T>> {
    T parent;
}

class AVLNode extends BaseNode<AVLNode> {
}
类基本节点{
T亲本;
}
类AVLNode扩展了BaseNode{
}

您可以执行
BaseNode
,但我可以看到这会导致更多问题。很高兴知道为什么
parent
的类型必须与您选择实例化的子类型匹配-它以什么方式阻止您实现AVL树?@VinceEmigh不能说,我想我们可以找到一种方法来绕过这个限制,让
BaseNode
变量引用
parent
,但我真正想知道的是如何解决这个“用自己类型的成员扩展类”的问题,这里我只是想举个例子。希望我能有一个大局一旦尝试了你和约翰库格曼提到的实现!你确定你试图做的不是应该避免的设计缺陷吗?它似乎不会影响你实现AVL树的能力,所以你应该问自己:“我想实现的设计有什么真正的用途吗?”-从我的角度来看,我看不出这样的设计有什么用途,这可能是语言没有投入资源简化它的原因(设计师也没有看到用途)。你能详细说明你为什么要这样做吗?事实上,像这样的设计似乎是设计师通常会避免的事情。当我想得更多的时候,我甚至找不到一个这样的设计的用例。如果你能找到一个单一的目的,像这样的设计可以简化你的工作,我相信我可以用更坚固的设计把它击倒。这种设计似乎很痛苦:
AVLNode为
BaseNode
的任何潜在子类型扩展了BaseNode
——似乎没有任何理由会有过多的冗余。我甚至还没有分析过潜在的问题,我已经建议你不要这样做了,除非你有实际的目的需要它。@VinceEmigh也许这是真的,假设我们在
BaseNode
中确实不需要
父节点
,但毕竟我们在任何
节点
中都需要
字段,所以我们仍然希望有一个类,其中的成员属于自己的类型,当然,在某个时候我们需要扩展这个类,所以仍然会遇到“如何扩展这样的类”的问题,我只是想举个例子,这不是一个实际的/家庭作业问题。你能给我举个例子,说明我们如何声明
BaseNode
AVLNode
w/Solution2的变量吗?