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

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

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

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