欢迎访问
我们一直在努力

通过一道题谈谈golang的组合

我们从这个例子说起

type People struct{}

func (p *People) ShowA() {
    fmt.Println("showA")
    p.ShowB()
}

func (p *People) ShowB() {
    fmt.Println("showB")
}

type Teacher struct {
    People
}

func (t *Teacher) ShowB() {
    fmt.Println("teacher showB")
}

func main() {
    t := Teacher{}
    t.ShowA()
}

这个题的结果是

showA
showB

最开始我判断错了,误以为按照重载的概念来讲,想到的结果是

showA
teacher showB

golang官方从来没说支持继承、重载之类的,以上例子中只是叫组合而已,只是把另外一个结构体的方法组合过来,底层实现上只是加了一个匿名类型的People

也就是说main里面的t.ShowA(),实际上只是隐藏里组合过来的匿名类型的People,我们展开来看实际底层是这么调用的,t.People.ShowA(),只不过t.People是匿名了,简化为t.ShowA(),因此t.ShowA()里面调用的p.ShowB()实际上是t.People.ShowB(),也就是showB的结果了。

以上可以看出这种实际上是匿名组合而已,和继承不是一个概念,继承是将基类的方法都继承过来,组合当然不是了。

未经允许不得转载:威威牛 » 通过一道题谈谈golang的组合
分享到: 更多 (0)