Tag: 组合

1 Posts

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