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

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


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

转载于:https://my.oschina.net/jmjoy/blog/384507

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值