天天看點

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
}