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
}