开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:继承快速入门应用实例】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9693
继承快速入门应用实例
内容简介
一、快速入门案例
二、代码实现
三、继承给编程带来的便利
一、 快速入门案例
案例:
我们对 extends01.go 改进,使用嵌套匿名结构体的方式来实现继承特性,请大家注意体会这样编程的好处。
二、代码实现
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
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