我们从这个例子说起
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
的结果了。
以上可以看出这种实际上是匿名组合而已,和继承不是一个概念,继承是将基类的方法都继承过来,组合当然不是了。