在Go语言中,没有传统面向对象语言中所定义的“类”,因此不存在所谓的“继承”。但是,Go语言提供了一种通过组合实现类似继承的方法,叫做嵌入(Embedding)。
嵌入可以让我们将一个类型嵌入到另一个类型中,这样被嵌入的类型就可以直接访问嵌入它的类型的属性和方法,而无需通过接口或者其他方式来访问。这个过程类似于传统的“继承”,但是更加灵活。
下面,我们将通过几个例子来演示如何使用嵌入实现类似继承的功能。
- 基础例子
我们先定义几个基础的结构体,狗、猫和人:
type Dog struct {
name string
}
func (d Dog) Bark() {
fmt.Println(d.name, ": 汪汪汪!")
}
type Cat struct {
name string
}
func (c Cat) Mew() {
fmt.Println(c.name, ": 喵喵喵!")
}
type Person struct {
name string
}
func (p Person) Speak() {
fmt.Println(p.name, ": 你好!")
}
现在我们要创建一种动物类型,它可以“继承”狗和猫,并且还有自己的属性和方法,比如颜色和奔跑的速度。我们可以这样来定义:
type Animal struct {
Dog
Cat
color string
runSpeed int
}
func (a Animal) Run() {
fmt.Println(a.color, "的动物以", a.runSpeed, "km/h的速度奔跑!")
}
在这个定义中,Animal类型嵌入了Dog和Cat类型。这意味着Animal类型实例化的对象可以直接访问Dog和Cat类型的属性和方法。我们也可以给Animal类型定义自己的属性和方法,比如color和runSpeed,用来表示动物的颜色和奔跑的速度,并且定义一个Run方法来描述动物的奔跑动作。
现在我们来创建一个Animal对象,看看它是如何工作的:
func main() {
d := Dog{name: "小黑"}
c := Cat{name: "小白"}
a := Animal{d, c, "黑白相间", 50}
a.Bark() // 小黑 : 汪汪汪!
a.Mew() // 小白 : 喵喵喵!
a.Run() // 黑白相间 的动物以 50 km/h的速度奔跑!
}
我们可以看到,通过嵌入Dog和Cat类型,Animal对象可以直接调用Bark和Mew方法,而无需使用接口或其他方式。这种方式可以让我们在不使用传统意义上的“继承”情况下实现类似的功能。
- 嵌入自定义类型
我们可以将一个自定义类型嵌入到另一个自定义类型中,实现类似继承的效果。现在,我们来定义一个Person类型和一个Student类型,并将Person类型嵌入到Student类型中:
type Person struct {
name string
age int
sex string
}
type Student struct {
Person
class string
score float64
}
在这个定义中,Student类型嵌入了Person类型。实例化Student类型对象的时候,可以使用Person的属性和方法。比如,我们可以实例化一个学生对象,设置他的姓名、年龄、性别、班级和成绩:
func main() {
s := Student{
Person: Person{
name: "小明",
age: 18,
sex: "男",
},
class: "高三一班",
score: 92.5,
}
fmt.Println("姓名:", s.name)
fmt.Println("年龄:", s.age)
fmt.Println("性别:", s.sex)
fmt.Println("班级:", s.class)
fmt.Println("成绩:", s.score)
}
当我们运行这个程序时,可以看到输出如下:
姓名: 小明
年龄: 18
性别: 男
班级: 高三一班
成绩: 92.5
我们可以看到,Student对象可以直接访问Person类型对象的属性和方法,包括name、age和sex等属性。
- 嵌套嵌入
在一个类型中嵌套多个类型也是可以的。我们可以将Animal类型嵌入到另一个类型中,来实现更多的功能。比如,我们现在来定义一个Zoo类型:
type Zoo struct {
Animal
name string
address string
}
func (z Zoo) ShowInfo() {
fmt.Println("这是", z.name, ", 地址是", z.address)
z.Run()
}
在这个类型的定义中,我们将Animal类型嵌入到Zoo类型中。这样,Zoo类型可以直接访问Animal类型的属性和方法,包括Run方法。我们再定义一个ShowInfo方法来输出动物园的名称和地址,并且调用Animal类型的Run方法来展示动物们的奔跑。
现在,我们创建一个动物园对象,并测试它的方法:
func main() {
d := Dog{name: "小黑"}
c := Cat{name: "小白"}
a := Animal{d, c, "黑白相间", 50}
z := Zoo{a, "北京动物园", "北京市海淀区清华科技园路"}
z.ShowInfo()
}
当我们运行这个程序时,可以看到输出如下:
这是 北京动物园 , 地址是 北京市海淀区清华科技园路
黑白相间 的动物以 50 km/h的速度奔跑!
我们可以看到,通过将Animal类型嵌套到Zoo类型中,我们可以创建出具有更多功能的类型,可以展示动物园的信息和动物们的奔跑动作。
总结
虽然在Go语言中没有传统面向对象语言所定义的类和继承的概念,但是嵌入的概念可以让我们在不使用传统的继承方式的情况下,实现类似的功能,更加灵活和方便。通过以上的例子,我们可以看到,嵌入可以轻松创建一个包含子类型的类型,并且可以方便地调用它们的方法和属性。
以上就是golang怎么继承的详细内容,更多请关注编程网其它相关文章!