38-Golang中的继承

继承基本介绍和示意图

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

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

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

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

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

type Goods strust {

​	Name string

​	Price int

}

type Book struct{

​	Goods //这里就是嵌套匿名结构体Goods

​	Writer string

}
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匿名结构体
}
//大学生
type Graduate struct {
	Student
}


//这时pupil结构体特有的方法,保留
func (p *Pupil) testing() {
	fmt.Println("小学生考试中")
}
func (p *Graduate) testing() {
	fmt.Println("大学生考试中")
}

func main() {
	//当我们对结构体嵌入了匿名结构体使用方法会发生变化
	pupil := &Pupil{}
	pupil.Student.Name = "tom"
	pupil.Student.Age = 8
	pupil.testing()
	pupil.Student.SetScore(90)
	pupil.Student.ShowInfo()

}

//小学生考试中
//学生名=tom 年龄=8 成绩=90


继承深入讨论

  • 1.结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法,都可以使用
  • 2.匿名结构体字段访问可以简化

在这里插入图片描述
- (1)当我们直接通过b访问字段或者方法时,其执行流程如下:b.Name
- (2)编译器会先看b对应的类型有没有Name,如果有,则直接调用B类型的Name子弹
- (3)如果没有就去看B中嵌入的匿名结构体A有没有声明Name字段,如果有就调用,如果没有继续查找,如果都找不到就报错

  • 3.当结构体和匿名结构体有相同的字段或者方法时,编译器选择采用就近访问原则访问,如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分
    在这里插入图片描述
  • 4.结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的子弹和方法),在访问时,就必须指定匿名结构体名字,否则编译报错
package main
import (
	"fmt"
)
type A struct {
	Name string
	age int
}
type B struct {
	Name string
	Score float64
}
type c struct {
	A
	B
// 	Name string
}
func main() {
	var c c
	//如果c,没有Name字段,而A和B有Name,
	//这是就必须指定匿名结构体名字来区分
	//所以cName就会被报编译错误,这个规则对方法也是一样的
	c.A.Name = "tom" //error
	fmt.Println("c")
}




  • 5.如果一个struct嵌套了一个有名结构体这种模式就是组合,如果是组合关系,那么在访问结构体的字段或方法时,就必须带上结构体的名字

在这里插入图片描述

  • 6.嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值。
    在这里插入图片描述

多重继承

  • 1.如果一个struct嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现多重继承
  • 2.如嵌入的匿名结构体有相同的字段名或者方法名,则在访问时,需要通过匿名结构体类型名来区分
  • 3.为了保证代码的简洁性,尽量不使用多重继承

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值