继承快速入门应用实例|学习笔记

简介: 快速学习继承快速入门应用实例

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:继承快速入门应用实例】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9693


继承快速入门应用实例

 

内容简介

一、快速入门案例

二、代码实现

三、继承给编程带来的便利

 

一、 快速入门案例

案例:

我们对 extends01.go 改进,使用嵌套匿名结构体的方式来实现继承特性,请大家注意体会这样编程的好处。

 image.png


二、代码实现

1. 输入代码

打开 VSCode ,在上一节的代码中改进,代码如下:

package main

import (

“fmt”

)

//编写一个学生考试系统

type student struct {

Name string

Age int

Score int

}

//将Pupil和Graduate共有的方法也绑定到student

func (stu *student) ShowInfo {

fmt.Printf(“学生名=%v 年龄=%v 成绩=%v\n”, stu.Name, stu.Age, stu.Score)

}

func (stu *student) SetScore(score int) {

//业务判断

stu.Score = score

}

//小学生

Type Pupil struct {

student //嵌入了student匿名结构体

}

//显示他的成绩

//这时Pupil结构体特有的方法,保留

func (p *Pupil) testing() {

fmt.Println(“小学生正在考试中.....“)

}

//大学生,研究生。。

//大学生

type Graduate struct {

student //嵌入了student匿名结构体

}

//显示他的成绩

func (p *Graduate) testing() {

fmt.Println(“大学生正在考试中.....”)

}

//代码冗余..高中生.....

Func main() {

//当我们对结构体嵌入匿名结构体使用方法会发生变化

pupil := &Pupil{}

pupil.Student.Name = “tom~”

pupil.Student.Age = 8

pupil.testing()

pupil.Student.SetScore(70)

pupil.Student.ShowInfo()

}

以上代码执行结果为:

D:\goproject\src\go_code\chapter11\extendsdemo>go run main.go

小学生正在考试中.....

学生名=tom~  年龄=8  成绩=70

image.png

2. 代码添加

上文代码只能执行出小学生的,若想执行出大学生的,只需在上文最后方中添加以下代码:

graduate := &Graduate{}

graduate.Student.Name = “mary~”

graduate.Student.Age = 28

graduate.testing()

graduate.Student.SetScore(90)

graduate.Student.ShowInfo()

添加以上代码后,执行结果为:

D:\goproject\src\go_code\chapter11\extendsdemo>go run main.go

小学生正在考试中.....

学生名=tom~  年龄=8  成绩=70

大学生正在考试中.....

学生名=mary~  年龄=28  成绩=90

3. 代码总结

通过此实例,使用到了匿名结构体,且通过匿名结构体的方法体现出了 Golang 里面向对象编程”继承“的特性;可以看出上文中的继承和传统的继承区别很大,传统继承只是把 extends Student 一写就行,但是它这里很松散,并需要慢慢去体会,它有许多好处;在学 Java 语言或其他编程语言时不太容易搞清楚,但是 Golang 设计者设计的就很简单,需要什么就把其嵌进去就行,且既然有一个承继关系,只需访问到哪一层随后直接点进去就可以了,尽量让代码没有会使人混淆的地方,这便是 Golang 设计者的一个初衷,即让代码看起来更简洁。

 

三、继承给编程带来的便利

1. 带来的便利

①代码的复用性提高了

②代码的扩展性和维护性提高了

2.如何体现出代码的扩展性和维护性提高了

比如希望给 Graduate 和 Pupil 增加同一个方法,即它们都可以做算术题,需要两处新添代码,首先在

func (stu *student) SetScore(score int) {

//业务判断

stu.Score = score

}

的后面添加一段新的代码,如下:

//给*Student 增加一个方法,那么Pupil和Graduate都可以使用该方法

func (stu *student) GetSum(n1 int, n2 int) int {

return n1 + n2

}

其次修改以下位置的代码,修改如下:

//当我们对结构体嵌入匿名结构体使用方法会发生变化

pupil := &Pupil{}

pupil.Student.Name = “tom~”

pupil.Student.Age = 8

pupil.testing()

pupil.Student.SetScore(70)

pupil.Student.ShowInfo()

fmt.Println(“res=”, pupil.student.GetSum(1,2))

graduate := &Graduate{}

graduate.Student.Name = “mary~”

graduate.Student.Age = 28

graduate.testing()

graduate.Student.SetScore(90)

graduate.Student.ShowInfo()

fmt.Println(“res=”, graduate.student.GetSum(10,20))

}

以上代码执行结果如下:

D:\goproject\src\go_code\chapter11\extendsdemo>go run main.go

小学生正在考试中.....

学生名=tom~  年龄=8  成绩=70

res=3

大学生正在考试中.....

学生名=mary~  年龄=28  成绩=90

res=30

相关文章
|
6月前
|
C语言 C++ 开发者
C++基础知识(一:命名空间的各种使用方法)
C++在C的基础上引入了更多的元素,例如类,类的私密性要比C中的结构体更加优秀,引用,重载,命名空间,以及STL库,模板编程和更多的函数,在面向对象的编程上更加高效。C语言的优势则是更加底层,编译速度会更快,在编写内核时大多数都是C语言去写。 在C++中,命名空间(Namespace)是一种组织代码的方式,主要用于解决全局变量、函数或类的命名冲突问题。命名空间提供了一种封装机制,允许开发者将相关的类、函数、变量等放在一个逻辑上封闭的区域中,这样相同的名字在不同的命名空间中可以共存,而不会相互干扰。
133 0
|
C++
42 C++ - 继承概述
42 C++ - 继承概述
52 0
|
8月前
|
XML 网络协议 关系型数据库
Qt框架概述与应用实例
Qt框架概述与应用实例
137 0
|
8月前
|
JSON 数据格式
如何创建接口,设计过接口
项目遵循Restful规范设计接口,请求路径基于资源命名,如查询用GET,新增用POST,修改用PUT,删除用DELETE。GET参数通过问号或路径传递,POST/PUT用JSON。统一的接口规范规定:返回数据多时,用VO过滤或整合数据。
54 0
|
存储 安全 Java
【C++】模板进阶|继承
模板的特化和分离编译、继承的全方面剖析。
C#简单继承示例详解——快速入门
C#简单继承示例详解——快速入门
|
Java
19 接口快速入门
接口就是把给出的一些未实现的方法,封装到一起;某个类需要实现接口的时候再重写这些方法
98 0
|
设计模式 存储 前端开发
SpringMVC入门(工作原理、框架流程、小实例的创建)
SpringMVC入门(工作原理、框架流程、小实例的创建)
130 0
SpringMVC入门(工作原理、框架流程、小实例的创建)
|
搜索推荐 大数据 测试技术