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

你可能感兴趣的:(GO语言:优雅地实现多重继承)