GO语言:优雅地实现多重继承

JM_Joy · · 16585 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

    有些语言支持多重继承,但是如果多个父类存在相同的属性或方法,就会发生冲突,有些语言为了防止这种情况而只支持单继承,很明显就没有了复用多个父类的属性和方法的优势。


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采用的是组合的方式来实现面向对象中的继承,再次证实了“组合优于继承”这句话。


有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:JM_Joy

查看原文:GO语言:优雅地实现多重继承

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

16585 次点击  
加入收藏 微博
2 回复  |  直到 2017-12-28 11:14:31
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传