开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:多重继承介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9696
多重继承介绍
内容简介
一、课堂练习
二、多重继承说明
三、多重继承细节说明
一、 课堂练习
1. 练习题目及分析
面向对象编程-继承的课堂练习,题目:结构体的匿名字段是基本数据类型,如何访问,下面代码输出什么?
如下代码所示:
type A struct {
Name string
Age int
}
type Stu struct {
A
int
}
func main() {
stu := Stu{}
stu.Name = “ton”
stu.Age = 10
stu.int = 80
fmt.Println(stu)
}
可以直接嵌入到 Stu 结构体里面,以上代码中有 type A ,这个 A可以通过匿名的方式嵌入到 struct ,虽在前面已经讲过,但是在
type Stu struct {
A
int
}
结构体当中也可以嵌入基本数据类型,比如 int 字段,因为它是基本数据类型,基本数据类型它自己没有字段,因此在访问时就可以直接通过名字”stu.int = 80“就可以,这种用法在 Golang 里是允许的。
2. 代码实现
在上一节建的 main.go 文件中添加以下代码:
type Monster struct {
Name string
Age int
}
type E struct
Monster
int
}
//演示一下匿名字段时基本数据类型的使用
var e E
e.Name = “狐狸精”
e.Age = 300
e.int = 20
fmt.Println(“e=”, e)
}
执行结果为:
D:\goproject\src\go_code\chapter11\extendsdetails2>go run main.go
c
tv <<电视机001 5000.99> <海尔 山东>>
tv2 <<电视机002 5000.99> <夏普 北京>>
tv3 <电视机003 7000.99> <创维 河南>
Tv4 <电视机004 9000.99> <长虹 四川>
e= <<狐狸精 300> 20>
3. 强调说明
(1)如果一个结构体有 int 类型的匿名字段,就不能有第二个
(2)如果需要有多个 int 的字段,则必须给 int 字段指定名字。
例如:上文代码中 E 结构体内的 int 只能有一个,不能出现第二个,但是如果在 int 前面加上一个名字,那便可以出现两个 int ,如:
type E struct
Monster
int
n int
}
此时需要在后文代码中添加 n int ,如:
//演示一下匿名字段时基本数据类型的使用
var e E
e.Name = “狐狸精”
e.Age = 300
e.int = 20
e.n = 40
fmt.Println(“e=”, e)
}
修改后执行结果为:
D:\goproject\src\go_code\chapter11\extendsdetails2>go run main.go
c
tv <<电视机001 5000.99> <海尔 山东>>
tv2 <<电视机002 5000.99> <夏普 北京>>
tv3 <电视机003 7000.99> <创维 河南>
Tv4 <电视机004 9000.99> <长虹 四川>
e= <<狐狸精 300> 20 40>
二、多重继承说明
1. 多重继承概念
如一个 struct 嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现了多重继承。多重继承在之前已经讲过,只是没有将概念抛出来。在讲细节时,如下段代码:
type TV struct {
Goods
Brand
}
在 TV 里有两个匿名结构体,说明 TV 既继承了 Goods ,又继承了Brand ,这便是多重继承。在 Golang 里它实现多重继承其实就是嵌入多个匿名结构体。
2. 代码实现
type Goods struct {
Name string
Price float64
}
type Brand struct {
Name string
Address string
}
type TV struct {
Goods
Brand
}
三、多重继承的细节
1. 如嵌入的匿名结构体有相同的字段名或方法名,则在访问时,需要通过匿名结构体类型名来区分。在此之前讲过此知识点,在type Goods struct {
Name string
Price float64
}
type Brand struct {
Name string
Address string
}
type TV struct {
Goods
Brand
}
代码中,Goods 里面有 Name、Brand 里面也有 Name ,那就必须把匿名结构体的名称写出来,如:
//演示访问Goods的Name
Fmt.Println(tv.Goods.Name)
Fmt.Println(tv.Price)
3. 为了保证代码的简洁性,建议尽量不使用多重继承。因为多重继承容易将思路搞砸,现在很多多重编程语言已经把多重编程去掉了,但 Golang 设计者由于他本身就是C语言的设计者,因此把多重继承特性保留了下来,但是也在相关文档里提到,尽量不要使用多重继承,因为多重继承很容易把继承关系搞复杂。