面向对象编程三大特性-继承

1. 继承的基本介绍

继承可以解决代码复用,让我们的编程更加靠近人类的思维。

当多个结构体存在相同的属性(字段)和方法时,可以从这些结构中抽象出结构体。

其它的结构体不需要重新定义这些属性(字段)和方法,只需要嵌套一个Student匿名结构体即可。

image-20240521193206254

也就是说:在go中,如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。

嵌套匿名结构体的基本语法

1
2
3
4
5
6
7
type Goods struct { 
Name string
Price int
}
type Book struct {
Goods //这里就是嵌套匿名结构体 Goods Writer string
}

2. 案例

使用嵌套匿名结构体的方式来实现继承特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package main

import "fmt"

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

type Student struct {
Name string
Age int
Score int
}

// 将Public和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
}

// 给*Student增加一个方法,那么Pupil和Graduate都可以使用该方法
func (stu *Student) GetSum(n1 int, n2 int) int {
return n1 + n2
}

// 小学生
type Pupil struct {
Student //嵌入了Student匿名结构体
}

// 显示他的成绩
// 这是Pupil结构体特有的方法,保留
func (p *Pupil) testing() {
fmt.Println("小学生正在考试中......")
}

// 大学生
type Graduate struct {
Student //嵌入了Student匿名结构体
}

// 显示他的成绩
// 这是Graduate结构体特有的方法,保留
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()
fmt.Println("res=", pupil.Student.GetSum(1, 2))

graduate := &Graduate{}
graduate.Student.Name = "marry"
graduate.Student.Age = 28
graduate.testing()
graduate.Student.SetScore(90)
graduate.Student.ShowInfo()
fmt.Println("res=", graduate.Student.GetSum(10, 20))
}

/*
小学生正在考试中......
学生名=tom,年龄=8,成绩=70
res= 3
大学生正在考试中
学生名=marry,年龄=28,成绩=90
res= 30
*/

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!