go语言method方法的继承、重写,继承顺序的探讨
method方法的继承与struct的继承
前面介绍go语言的struct结构体的三种定义方法之中,我们有介绍了匿名字段,其中就包含了struct的继承,该继承的过程中不但继承了struct的字段、属性,而且method方法也继承了!这跟python类的继承机制几乎一样。我们直接上一个非常简单的实例吧!
method继承实例
package main
import "fmt"
type Flower struct{}
func (f Flower) flower_language() {
fmt.Println("这是花种类!")
}
type Rose struct {
Lan string
Flower //匿名字段,Rows继承了Flower的字段和方法
}
func main() {
var r Rose
r.flower_language()
}
代码输出:
这是花种类!
代码解析
如上代码,我们通过Rose类(结构体)通过匿名字段的设计,继承了Flower这个类,因此,我们并没有为Rose单独声明一个method方法,但是我们还是可以通过调用flower_language()这个方法。
method方法重写
method方法的重写其实跟声明一个相同的方法名但receiver接受体不同的方法一样,只是换了个说法而已,我们将上面的实例进行一番修改,增加如下代码:
func (r Rose) flower_language(){
fmt.Println(r.Lan)
}
//main函数里头修改为:
var r Rose
r.Lan = "这是玫瑰!"
r.Flower.flower_language()
r.flower_language()
代码输出:
这是花种类!
这是玫瑰!
代码解析
如上代码,我们对flower_language()方法进行了重写,并用两种不同的方法调用了这个方法,通过输出我们发现,该方法得到了很好的继承,也被很好地重写了。
method方法的继承顺序
python中的类可以继承多个父类,并按顺序进行优先排列,那么go语言当中是否也存在这样的机制呢?很多文档中并没有提到这一点,我们来尝试一下。我们在第一个实例当中添加如下代码(main当中不修改):
type Herbaceous struct{}
func (h Herbaceous) flower_language() {
fmt.Println("这是草本植物!")
}
//在Rows结构体当中添加Herbaceous匿名字段
Herbaceous
代码输出:
ambiguous selector r.flower_language
代码解析
如上代码,我们在Rose结构体当中增加Herbaceous匿名字段,以继承该字段,然后尝试通过r.flower_language()来调用继承来的方法,发现发生ambiguous selector r.flower_language的错误,意思就是调用的方法模糊不清,因为Flower结构体和Herbaceous结构体都声明了这中method方法。如果使用r.Flower.flower_language()或r.Herbaceous.flower_language(),便可正常调用。
因此,结论是:go语言结构体(类)的继承并没有像python那样的顺序机制。