The Go Programming Language
› http://golang.org/
› Go Playground
Go Projects
› Revel Web Framework
seran7

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

  •  
  •   seran7 · Jun 4, 2021 · 2371 views
    This topic created in 1977 days ago, the information mentioned may be changed or developed.

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

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

    但结构体是递归的,这样会使 RBTNode.Left 的类型是 TreeNode 而不是 RBTNode,没有 Color 属性
    seran7
    seran7
    OP
    Jun 4, 2021
    5
    @jworg 非常感谢🙏(我确实纠结了半天不知道怎么描述这个问题 2333
    Dom
    Dom
    Jun 5, 2021 via Android
    6
    用 interface,treenode,rbtnode 实现 max()
    index90
    index90
    Jun 23, 2021
    7
    独立一个 Max 函数: func Max(TreeNodeInterface)
    对于 RBTNode 的 Max 方法,调用 Max(RBTNode)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5069 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 08:54 · PVG 16:54 · LAX 00:54 · JFK 03:54
    ♥ Do have faith in what you're doing.