多重继承介绍|学习笔记

简介: 快速学习多重继承介绍

开发者学堂课程【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语言的设计者,因此把多重继承特性保留了下来,但是也在相关文档里提到,尽量不要使用多重继承,因为多重继承很容易把继承关系搞复杂。

相关文章
|
3天前
|
C++
50多重继承
50多重继承
15 0
|
10月前
|
C++
C++学习笔记_03类的继承 2021-04-15
C++学习笔记_03类的继承 2021-04-15
|
8月前
|
Java 编译器 PHP
C++的多重继承
派生类都只有一个基类,称为单继承(Single Inheritance)。除此之外,C++也支持多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、C#、PHP 等干脆取消了多继承。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A、类B和类C,那么可以这样来声明派生类D: class D: public A, private B, protected C{ //类D新增加的成员 } D 是多继承形式的派生类,它以公有的方式继承 A 类,
53 0
|
编译器 C++
C++中的多重继承
🐰多重继承 🌸声明多重继承的方法 🌸多重继承派生类的构造函数与析构函数 🌸多重继承引起的二义性
|
SQL 安全 数据库
对面向对象继承的一些思考
本文浅谈对面向对象继承的一些思考
107 0
对面向对象继承的一些思考
|
存储 Java PHP
多态|学习笔记
快速学习多态
59 0
多态|学习笔记
|
开发者 Python
不使用多态的问题 | 学习笔记
快速学习 不使用多态的问题
85 0
不使用多态的问题 | 学习笔记
|
网络协议 测试技术 Go
多态及体现 |学习笔记
快速学习多态及体现
62 0
多态及体现 |学习笔记
|
开发者 Python
多态的使用| 学习笔记
快速学习多态的使用
63 0