有些语言支持多重继承,但是如果多个父类存在相同的属性或方法,就会发生冲突,有些语言为了防止这种情况而只支持单继承,很明显就没有了复用多个父类的属性和方法的优势。
go语言其实没有对象的概念,只有结构体。
比如有一个父亲,是中国人:
type Father struct { MingZi string } func (this *Father) Say() string { return "大家好,我叫 " + this.MingZi }
可以理解为父亲类有一个属性,有一个Say方法
有父亲当然有母亲,母亲是个外国人:
type Mother struct { Name string } func (this *Mother) Say() string { return "Hello, my name is " + this.Name }
父亲和母亲结合有了孩子类,孩子类继承了父亲和母亲:
type Child struct { Father Mother }
然后孩子类有一个实例c:
c := new(Child) c.MingZi = "张小明" c.Name = "Tom Zhang"
因为MingZi和Name这个属性在Mother和Father中并没有冲突,所以可以直接使用 c. 就可以获取而没有问题
但是,如果这样直接调用Child类的Say方式:
c.Say()
会出现冲突:
ambiguous selector c.Say
怎么办?其实这样就可以轻松解决:
c.Father.Say() c.Mother.Say()
上面两条表达式的值分别为:
大家好,我叫 张小明
Hello, my name is Tom Zhang
事实上,Go采用的是组合的方式来实现面向对象中的继承,再次证实了“组合优于继承”这句话。