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

2023-12-05

假设我们需要使用一个名为“BaseNode”的类来实现不同类型的树,从该类派生出其他类型的节点,并且它假设有一个名为“BaseNode”的实例变量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 - Make BaseNode将子类作为参数的泛型类。现在parent可以是所需的确切类型。

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

class AVLNode extends BaseNode<AVLNode> {
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用自己类型的成员扩展类? 的相关文章

随机推荐

  • 如何结合多处理和 eventlet

    我有一个任务需要启动 2 个进程 并且每个进程内需要启动 2 个线程才能真正工作 下面是我用来模拟我的用例的源代码 import multiprocessing import eventlet def subworker num1 num2
  • GCC 和 MS 编译器的模板实例化详细信息

    任何人都可以提供模板实例化方式的比较或具体细节吗 在 GCC 和 MS 编译器中的编译和 或链接时处理 这个过程有什么不同吗 在静态库 共享库和可执行文件的上下文中 我发现this doc关于 GCC 如何处理它 但我不确定这些信息是否 仍
  • “异步任务然后等待任务”与“任务然后返回任务”[重复]

    这个问题在这里已经有答案了 为了对异步编程和await 我想知道这两个代码片段在多线程以及执行顺序和时间上有什么区别 This public Task CloseApp return Task Run gt save database tu
  • 在silverlight中从字符串转换为数据?

    基本上我正在尝试这样做 Path path new Path string sData M 250 40 L200 20 L200 60 Z var converter TypeDescriptor GetConverter typeof
  • 如何在 SQL Server 中获取区分大小写的排序规则版本?

    有没有办法获得区分大小写的排序规则版本以在查询中使用 假设该查询可用于具有不同排序规则的数据库 其中一些排序规则不区分大小写 并且可以具有不同的区域性 例如多个客户端 但是 此查询应始终以区分大小写的方式运行 同时 如果可能 不更改排序规则
  • new Object() 和 Object() 有什么区别[重复]

    这个问题在这里已经有答案了 在 C 中 您可以使用 new 关键字或其他方式实例化对象 Object o new Object 但你也可以这样做 Object o Object 两者之间到底有什么区别 为什么我要使用其中一种而不是另一种 你
  • 绘制椭圆边界点的百分比

    我使用 ellipsoidhull 函数来导出一个椭圆 该椭圆包围 x y 坐标中的所有点 然后 我使用 point in polygon 函数来预测一组新的 X Y 坐标是否落在椭圆内部 外部 是否可以使用 80 的点 而不是绘制一个包围
  • 命名空间无法识别(即使它存在)[重复]

    这个问题在这里已经有答案了 我收到此错误 找不到类型或命名空间名称 AutoMapper 您是否缺少 using 指令或程序集引用 有趣的是 我的项目中已经有了该参考 这是我的代码 using System Collections Gene
  • C 易失性位域结构的复制构造函数

    Good day 我正在尝试在 C 11 项目中使用 C SD 驱动程序 文件系统库 Keil MDK 它是由 Keil MDK 5 23 中的 Pack 管理器添加的 我正在使用 ARMCC 5 06u4 进行编译 我收到警告class
  • 对 css nth-child 求模

    我想找到一种方法来按照模式显示一些颜色到 div 我发现了一个使用模数的技巧 但它似乎不适用于 CSS 因此 如下面的 codepen 示例所示 蓝色背景属性应应用于 1 8 13 20 25 块 gt 我们可以看到每个状态之间的差异是 7
  • 如何删除 firebase 中的值

    只是一个小问题 现在我有这个结构 images uniqueId id logement 1747657 image dataimage uniqueId id logement 1747657 image dataimage unique
  • Java错误java.util.concurrent.ConcurrentHashMap.keySet

    嘿 伙计 我收到了这个错误 你能尝试解决这个问题吗 或者看看有什么问题 发布修复之类的东西 非常感谢大佬 Exception in thread ExtensionHandler 1 java lang NoSuchMethodE rror
  • 比较 SQLAlchemy ORM 中两列之间的差异

    我正在尝试找出如何做类似答案的事情这个问题但使用 SQLAlchemy 在不诉诸原始 SQL 的情况下 很难找到如何根据两列之间的差异对查询结果进行排序 任何帮助是极大的赞赏 另外 出于好奇 是否可以创建一个自动计算其他两列之间差异的列 例
  • 带参数的 Orbeon 发送按钮

    我已经寻找了一段时间 但找不到一个解决方案 允许我在按下 保存最终 按钮时将请求参数从表单发送到外部 Web 应用程序 这是我到目前为止在properties local xml 中所拥有的内容
  • 检查 C# 中输入的数据类型是否正确

    我想要的是基本上让用户输入一个浮点数 然后系统检查输入是否确实是一个浮点数 如果是 那么它将继续执行代码 如果不是 那么用户将有以正确的数据类型重新输入 对于初学者的问题 抱歉 代码示例是 Console Write Response Va
  • 如何在异步函数中使用 threading.Lock,同时可以从多个线程访问对象

    我想用threading Lock 在异步函数中 asyncio Lock 不是线程安全的 所以我不能这样做with await asyncio Lock 我需要使用的原因threading Lock 是因为这个对象may可以通过多个线程访
  • 尝试使用“execvp()”运行“ls | grep r”

    我创建了一个pipe在两个子进程之间 首先 我跑ls 写入正确的 fd 然后 我跑grep r 从正确的 fd 读取 我可以在终端中看到grep命令工作正常 输出 问题是grep不会退出 它会留在那里 即使ls不再运行 对于其他程序pipe
  • JInternalFrame 位于前面并聚焦

    一个人如何推动一个JInternalFrame到 JDesktopPane 中所有框架的顶部 尝试grabFocus 和requestFocus 其中之一应该有效 我个人只使用了requestFocus
  • 表数据网关和模型

    我听说过 胖模型 瘦控制器 这句话 并且相信我理解它的含义 在工作过程中Zend 快速入门指南我遇到过表数据网关模式 在我看来 这种设计模式正在倡导 MVC 堆栈的第四个组件 它正在从 胖模型 转向 瘦模型 瘦控制器和胖 TableData
  • 如何使用自己类型的成员扩展类?

    假设我们需要使用一个名为 BaseNode 的类来实现不同类型的树 从该类派生出其他类型的节点 并且它假设有一个名为 BaseNode 的实例变量parent它自己的类型 通常看起来像 class BaseNode some fields