首页 > 解决方案 > 如何在不使用接口的情况下扩展二叉树节点?

问题描述

type struct Node {
  x Data
  l *Node
  r *Node
}

鉴于上面的结构,我正在研究二叉搜索树的各种实现,它们都在同一个包中,这样它们就可以在没有公共接口的情况下共享内部结构。但是,某些树需要一个等级字段作为其节点的一部分,我想将其创建为基本结构的扩展。我不希望不需要排名字段的树分配具有排名字段的节点。

type struct RankedNode {
  Node
  z rank
}

起初,这似乎是正确的,并且向我传达了明确的意图。但是,这不起作用,因为 internallrfields 是 type Node,破坏代码如下:

func (p *RankedNode) heapify() *RankedNode {
    // ...
    p.l.heapify()
    p.r.heapify()
}

当然,p.landp.r都是 type Node,所以heapify没有定义。我们可以假设任何节点只能链接到完全相同类型的节点。

问:接口和类型断言是Node在没有泛型的情况下实现这一目标的唯一方法吗?

func (p *RankedNode) heapify() *RankedNode {
    // ...
    p.L().(*RankedNode).heapify() 
    p.R().(*RankedNode).heapify() // :(
}

标签: goinheritanceembedding

解决方案


推荐阅读