Go的面向对象编程特性
封装
继承
go中使用匿名结构体来实现继承!
- 结构体可以使用嵌套结构体内所有字段和方法
匿名结构体字段访问可以简化
如果结构体与匿名结构体含有相同的字段或方法,编译器采用就近原则
- 结构体嵌入多个匿名结构体时,如果两个嵌入的匿名结构体含有相同字段或方法(同时鸡骨头提本身没有同名字段方法),在访问时,必须值命匿名结构体名字,否则编译报错。
- 如果一个结构体嵌套了一个有名结构体,那么这种模式就是组合,租还关系在访问时必须带上结构体名字
- 嵌套匿名结构体后,也可以在创建结构体变量时,直接指定各个匿名结构体字段的值。
- 如果一个结构体有一个基本类型的匿名结构体,那么就只能拥有这种类型的字段一个
package BasicLearn
import "fmt"
type Student struct { //公共父类 Student
Name string
Age int
Score int
}
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匿名结构体,相当于继承
}
func(p *Pupil)testing(){
fmt.Println("小学生正在考试呢!!!")
}
//子类大学生
type Graduate struct {
Student
}
func(g *Graduate)testing(){
fmt.Println("大学生正在考试呢!!!")
}
func TestExtend() {
pupil := &Pupil{}
pupil.Student.Score = 80
pupil.Student.Name = "大头"
pupil.Student.Score = 100
fmt.Println(*pupil)
//1. 结构体可以使用嵌套结构体内所有字段和方法
//2. 匿名结构体字段访问可以简化
pupil.Score = 88
pupil.Name = "大5头"
pupil.Score = 90
fmt.Println(*pupil)
}
多重继承
多态
多态主要通过接口来体现
- 多态参数
可以定义方法接受接口类型,不同实现的结构体会调用自己的对应方法。
- 多态数组
可以定义一个接口数组,数组内可以存储实现了接口的不同结构体。