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

写在前言

作为一个在校学习了三年的Java后端开发程序员来说,由于校招工作的需要,要转语言为Golang,一开始内心是有点拒绝的,毕竟Java的生态非常成熟,求职岗位很多。但是,随着Golang语言的发展和云计算的成熟,国内大厂如腾讯、百度、字节等也越来越多的使用Golang,所以尝试一下新的语言也未曾不可。巴拉巴拉了半天(废话连篇哈哈),下面直蹦主题吧~

继承

继承可以解决代码复用的问题。当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出一个匿名结构体,在该结构体中定义相同的属性(字段)和方法。其他的结构体不需要重新定义这些属性和方法,只需要嵌套一个这个匿名结构体。也就是说,在go语言中,如果一个结构体嵌套了另一个匿名结构体,那么这个结构体就可以直接访问匿名结构体的字段和方法,从而实现继承特性。

在这里插入图片描述
也就是说:在 Golang 中,如果一个 struct 嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。(就问你牛不牛逼,有没有感觉比Java语法简单的多哈哈哈哈嗝~)

语法
package main

import (
	"fmt"
)

type A struct {
	Name string
	age int
}
type B struct {
	A
}
深入
简单的例子

一个小问题,看个学生考试系统的程序extends01.go,提出代码复用的问题

package main

import (
	"fmt"
)
type Student struct {
    Name string
    Age int
    Score float64
}
func (student *Student) ShowInfo() {
    fmt.Printf("学生名=%v 年龄=%v 成绩=%v\n",student.Name,student.Age,student.Score)
}
func (student *Student) SetScore(score float64) {
    student.Score = score
}
type Pupil struct {
    Student
}
func (pupil *Pupil) Testing() {
    fmt.Println("考试的内容不一样,正在考试中.....\n")
}
type Graduate struct {
    Student
}
func (graduate *Graduate) Testing() {
    fmt.Println("考试的内容不一样,正在考试中.....\n")
}

继承给编程带来的便利

1)代码的复用性提高了
2)代码的扩展性和维护性提高了

继承的深入讨论

结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法, 都可以使用。【举例说明】
在这里插入图片描述
在这里插入图片描述
匿名结构体字段访问可以简化,如图
在这里插入图片描述
对上面的代码小结

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

当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问,如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分【举例说明】
在这里插入图片描述
结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字,否则编译报错。【举例说明】
在这里插入图片描述
如果一个struct嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字
在这里插入图片描述
在这里插入图片描述
嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

面向对象编程-多重继承

多重继承说明如一个struct嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现了多重继承。案例演示通过一个案例来说明多重继承使用

在这里插入图片描述
多重继承细节说明1)如嵌入的匿名结构体有相同的字段名或者方法名,则在访问时,需要通过匿名结构体类型名来区分。【案例演示】
在这里插入图片描述
为了保证代码的简洁性,建议大家尽量不使用多重继承

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值