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那样的顺序机制。



全栈后端 / go语法 :













Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.