V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
seran7
V2EX  ›  Go 编程语言

向大佬们求教一个 go 的递归结构体方法派生与扩展相关的问题

  •  
  •   seran7 · 2021-06-04 18:55:22 +08:00 · 1215 次点击
    这是一个创建于 1046 天前的主题,其中的信息可能已经有所发展或是发生改变。

    求教,以基础树结构(二叉搜索树)为例:

    type TreeNode struct{
          Val     int
          Left    *TreeNode
          Right   *TreeNode
    }
    

    已经基于这种结构写了 Max()Min()方法,例如:

    func (n *TreeNode) Max(){} 
    

    如果想要把基础树结构扩展到红黑树 RBTNode ,相当于基础树结构 TreeNode 多加了 Color 字段:

    type RBTNode struct{
          Color   int   // 新加的字段
          Val     int
          Left    *RBTNode 
          Right   *RBTNode 
    }
    

    如果想对 RBTNode 调用与扩展属性无关的方法,例如 Max(),只能通过重写一份相似代码的形式来实现吗?例如:

    func (n *RBTNode) Max(){} 
    

    // 备注:之前想过派生,但很明显是不可行的。。

    7 条回复    2021-06-23 18:03:20 +08:00
    jworg
        1
    jworg  
       2021-06-04 19:12:57 +08:00
    这个关键词是 ”golang 组合 继承“ 用 interface 来做,可以见 https://www.jianshu.com/p/150523db21a9
    darksword21
        2
    darksword21  
       2021-06-04 20:06:42 +08:00 via iPhone
    RBTNode 中直接加 TreeNode 然后调可以吗
    darksword21
        3
    darksword21  
       2021-06-04 20:07:00 +08:00 via iPhone
    用手机不方便打代码
    seran7
        4
    seran7  
    OP
       2021-06-04 20:21:30 +08:00
    @darksword21 噢噢我明白你的意思,是不是这样?
    type RBTNode struct {
    Color int
    TreeNode
    }

    但结构体是递归的,这样会使 RBTNode.Left 的类型是 TreeNode 而不是 RBTNode,没有 Color 属性
    seran7
        5
    seran7  
    OP
       2021-06-04 20:27:36 +08:00
    @jworg 非常感谢🙏(我确实纠结了半天不知道怎么描述这个问题 2333
    Dom
        6
    Dom  
       2021-06-05 19:48:57 +08:00 via Android
    用 interface,treenode,rbtnode 实现 max()
    index90
        7
    index90  
       2021-06-23 18:03:20 +08:00
    独立一个 Max 函数: func Max(TreeNodeInterface)
    对于 RBTNode 的 Max 方法,调用 Max(RBTNode)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5406 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:09 · PVG 15:09 · LAX 00:09 · JFK 03:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.