开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:面向对象编程-继承引出】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9691
面向对象编程-继承引出
内容简介:
一、继承引出
二、代码实现
三、代码小结
一、 继承引出
抛出问题,引出继承的必要性
每当去学一个新的东西都是有原因的, Golang 的设计者在设计继承时,为什么需要继承?这里有个小问题:看学生考试系统的程序 extends01.go ,提出代码复用性的原因。如下图所示的学生会管理系统,里面有各种各种的学生。
比如现在需要去记录各学生的考试成绩,应当如何处理?
二、代码实现
1. 代码实现,解决问题
走一下代码:
首先新建一个文件夹称为 extendsdemo ,在其中新建一个文件称为 main.go ,并输入以下代码:
package main
import (
“fmt”
)
//编写一个学生考试系统
//小学生
type Pupil struct {
Name string
Age int
Score int
}
//显示他的成绩
func (p *Pupil) showInfo() {
fmt.Printf(“学生名=%v 年龄=%v 成绩=%v\n”, p.Name, p.Age, p.Score)
}
func (p *Pupil) SetScore(score int) {
//业务判断
p.Score = score
}
func (p *Pupil) testing() {
fmt.Println(“小学生正在考试中.....“)
}
func main(){
//测试
var pupil = &Pupil{
Name :”tom”,
Age : 10,
}
pupil.testing()
pupil.SetScore(90)
pupil.ShowInfo()
}
执行结果为:
D:\goproject\src\go_code\chapter11\encapexercise\main>cd ..
D:\goproject\src\go_code\chapter11\encapexercise>cd ..
D:\goproject\src\go_code\chapter11>cd extendsdemo
D:\goproject\src\go_code\chapter11\extendsdemo>go run main.go
小学生正在考试中.....
学生名=ton 年龄=10 成绩=90
2. 代码添加
将上文中仅有小学生的代码添加大学生和研究生,添加代码如下:
//大学生,研究生..
//大学生
type Graduate struct {
Name string
Age int
Score int
}
//显示他的成绩
func (p *Graduate) ShowInfo() {
fmt.Printf(学生名=%v 年龄=%v 成绩=%v\n”, p.Name, p.Age, p.Score)
}
func (p *Graduate) SetScore(score int) {
//业务判断
p.Score = score
}
func (p *Graduate) testing() {
fmt.Println(“大学生正在考试中.....“)
}
//测试
var graduate = &Graduate{
Name :”mary”,
Age : 20,
}
graduate.testing()
graduate.SetScore(90)
graduate.ShowInfo()
执行结果为:
D:\goproject\src\go_code\chapter11\extendsdemo>go run mai
n.go
小学生正在考试中.....
学生名=ton 年龄=10 成绩=90
大学生正在考试中.....
学生名=mary 年龄=20 成绩=90
三、代码小结
(1)Pupil 和 Graduate 两个结构体的字段和方法几乎相同,但是却写了两份相同的代码,代码复用性不强。
(2)出现代码冗余,而且代码不利于维护,同时也不利于功能的扩展。假设认为大学生 Graduate 和小学生 Pupil 他们都会做算术题,如果要给 Pupil 和 Graduate 用相同的方法,就需要加两份同样的代码,所以说不利于维护,同时也不利于功能的扩展。
(3)解决方法-通过继承方法来解决。写了一段代码过后引出继承的概念,为什么需要继承?先抛出了一个问题,通过其告诉你们面向对象编程的时候没有继承可能就会出现代码冗余,从而不利用代码的维护,因此继承便呼之欲出。