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

2021-06-04 18:55:22 +08:00
 seran7

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

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(){} 

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

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

但结构体是递归的,这样会使 RBTNode.Left 的类型是 TreeNode 而不是 RBTNode,没有 Color 属性
seran7
2021-06-04 20:27:36 +08:00
@jworg 非常感谢🙏(我确实纠结了半天不知道怎么描述这个问题 2333
Dom
2021-06-05 19:48:57 +08:00
用 interface,treenode,rbtnode 实现 max()
index90
2021-06-23 18:03:20 +08:00
独立一个 Max 函数: func Max(TreeNodeInterface)
对于 RBTNode 的 Max 方法,调用 Max(RBTNode)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/781438

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX