其他结构体不需要重新定义这些属性和方法,只需要嵌套一个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
}