天天看点

go语言之多继承 匿名结构体与匿名结构体指针go继承多继承和匿名结构体指针

go继承

go语言之多继承 匿名结构体与匿名结构体指针go继承多继承和匿名结构体指针

其他结构体不需要重新定义这些属性和方法,只需要嵌套一个Student匿名结构体。

使用:

直接 放另一个结构体名

package main

import "fmt"

func main() {
	// 小学生
	pupil := &pupil{}
	pupil.Student1.Name = "lwt小"
	pupil.Student1.Age = 11

	pupil.exam()
	pupil.Student1.SetScore(99)
	pupil.Student1.ShowInfo()

	// 大学生
	gradute := &gradute{}
	gradute.Student1.Name = "lwt大"
	gradute.Student1.Age = 21

	gradute.exam()
	gradute.Student1.SetScore(60)
	gradute.ShowInfo() // Student1也可省略
}

type Student1 struct {
	Name string
	Age int
	Score int
}

func (student *Student1) ShowInfo(){
	fmt.Printf("Name=%v,Age=%v,Score=%v\n",student.Name,student.Age,student.Score)
}

func (student *Student1) SetScore(score int){
	student.Score = score
}

type pupil struct{
	Student1 // 嵌入了匿名结构体(继承)
}

func (p *pupil) exam(){
	fmt.Println("小学生正在考试中。。(特有)")
}

type middle struct {
	Student1 // 嵌入了匿名结构体(继承)
}
func (m *middle) exam(){
	fmt.Println("中学生正在考试中。。(特有)")
}

type gradute struct {
	Student1 // 嵌入了匿名结构体(继承)
}
func (g *gradute) exam(){
	fmt.Println("大学生正在考试中。。(特有)")
}
           

和java不同之处

只要使用了匿名结构体,那将会得到结构体中所有大小写字段的属性和方法。这里打破私有的属性和方法不可在其他包使用

如果匿名结构体(父类中)和子类中出现重名,遵循就近原则。

有时,需要明确指定匿名结构体

多继承和匿名结构体指针

匿名字段更可以是基本数据类型、结构体、结构体指针

package main

import "fmt"

func main() {
	tv := Tv{
		Good{"电视机",9999},
		Brand{"海尔","山东青岛"},
	}
	fmt.Println(tv)

	tv2 := Tv2{
		&Good{
			Name:"空调",
			price: 99999,
		},
		&Brand{
			Name:"格力",
			position: "北京",
		},
	}
	fmt.Println(*(tv2.Good))
	fmt.Println(*tv2.Brand)
}

type Good struct {
	Name string
	price int
}

type Brand struct {
	Name string
	position string
}

type Tv struct {
	Good // 继承后,属性方法,大小写均忽略
	Brand
}

type Tv2 struct {
	*Good // 勿忘取地址&,勿忘取值*
	*Brand
}