多重继承介绍|学习笔记

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

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

相关文章
|
监控 NoSQL MongoDB
MongoDB索引机制与优化策略详解
【4月更文挑战第30天】本文深入解析MongoDB的索引机制,包括单字段、复合、地理空间、全文及哈希索引。介绍了创建与查看索引的方法,并提出了优化策略:选择性创建、使用复合索引、定期审查优化、避免不必要的索引扫描、利用索引前缀与覆盖索引,以及监控索引使用。通过这些策略,可提升MongoDB查询性能。
|
存储 Java 大数据
0036Java程序设计-基于Java的敬老院管理系统的设计和实现毕业设计论文1
0036Java程序设计-基于Java的敬老院管理系统的设计和实现毕业设计论文
175 0
|
DataWorks 安全 API
DataWorks产品使用合集之是否可以不使用DataWorks进行EMR的调度和DataX数据导入
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
弹性计算
ECS使用体验
ECS使用体验
|
JavaScript 前端开发
nodejs下ueditor文件上传时csurf与contentType冲突问题
表单提交时 form submit 直接就可以提交了,但是了防止跨站攻击,都可以加入CSRF来防御。
1216 0
|
存储 SQL 缓存
【Redis 系列】redis 学习一,数据库的演进及 Nosql 的初步认知
【Redis 系列】redis 学习一,数据库的演进及 Nosql 的初步认知
158 0
|
关系型数据库 MySQL 数据库
180620-mysql之数据库导入导出
实际工作中,需要做一下数据库迁移,需要导入导出数据,记录一下mysqldump的简单用法
156 0
180620-mysql之数据库导入导出
|
消息中间件 NoSQL Java
Sink
Sink
142 0