继承
继承可以解决代码复用。
当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体,在该结构体中定义这些相同的属性和方法。
其它的结构体不需要重新定义这些属性和方法,只需嵌套一个匿名结构体即可。
也就是说:在Golang中,如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。
嵌套匿名结构体的基本语法
type Goods struct {
Name string
Price int
}
type Book struct {
Goods //这里就是嵌套匿名结构体Goods
Writer string
}
继承实例
package main
import (
"fmt"
)
//编写一个学生考试
//学生
type Student struct {
Name string
Age int
Score int
}
type Pupil struct {
Student //嵌入了Student匿名结构体
}
type Graduate struct {
Student //嵌入了Student匿名结构体
}
//给*Student增加一个方法,那么Pupil和 Graduate都可以使用该方法
func (stu *Student) GetSum(n1 int ,n2 int ) int {
return n1 + n2
}
//显示成绩
func (s *Student) ShowInfo(){
fmt.Printf("姓名:%v 年龄 : %v 成绩:%v \n",s.Name,s.Age,s.Score)
}
//设置分数
func (s *Student) SetScore(score int){
s.Score=score
}
func (p *Pupil) tesing(){
fmt.Println("pupil tesing.....")
}
func (g *Graduate) tesing(){
fmt.Println("Graduate tesing......")
}
func main() {
pupil := &Pupil{}
pupil.Student.Name ="logn"
pupil.Student.Age =66
pupil.tesing()
pupil.Student.SetScore(77)
pupil.Student.ShowInfo()
fmt.Println(pupil.Student.GetSum(1,2))
graduate := &Graduate{}
graduate.Student.Name ="heyhey"
graduate.Student.Age =19
graduate.tesing()
graduate.Student.SetScore(89)
graduate.Student.ShowInfo()
}
继承的细节
1) 结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法,都可以使用。
2) 匿名结构体字段访问可以简化
当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问,如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分。
4) 结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字,否则编译报错。
5))如果一个struct嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字
type Hello struct{
stu Student //有名的结构体 组合关系
}
var hello Hello
hello.stu.Name ="hello"
fmt.Println(hello.stu.Name)
6) 嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值
type Goods struct {
Name string
Num int
}
type Brands struct {
Name string
Price float64
}
type Sport struct{
Goods
Brands
}
type Sport2 struct{
*Goods
*Brands
}
func main() {
nike := Sport{
Goods{"运动",8888},
Brands{"nike",456.123},
}
xter := Sport{
Goods{
Name: "跑鞋",
Num: 8888,
},
Brands{
Name: "特步",
Price: 96.12,
},
}
fmt.Println("nike",nike)
fmt.Println("特步",xter)
xter2 := Sport2{
&Goods{
Name: "衣服",
Num: 8888,
},
&Brands{
Name: "衣服",
Price: 96.12,
},
}
fmt.Println("特步2",*xter2.Goods,*xter2.Brands)
}
结构体的匿名字段是基本数据类型
说明
1) 如果一个结构体有int类型的匿名字段,就不能第二个。
2) 如果需要有多个int的字段,则必须给int字段指定名字
面向对象编程-多重继承
如一个struct嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的段和方法,从而实现了多重继承。
多重继承细节
1)如嵌入的匿名结构体有相同的字段名或者方法名,则在访问时,需要通过匿名结构体类型名来区分。
2)为了保证代码的简洁性,建议大家尽量不使用多重继承