package main

import (
	"fmt"
)

//继承可以解决代码复用,让编程更加接近人类思维
//当多个结构体存在相同属性和方法时,可以从这些结构体中抽象出结构体,在该结构体中定义这些相同的属性和方法
//其他结构体不需要重新定义这些属性和方法,只需要嵌套一个匿名结构体即可
//也就是说golang中,如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承的特性

type Student struct {
	Name  string
	Age   int
	Score int
}
type Pupil struct {
	Student//嵌入匿名结构体Student
}
type Graduate struct {
	Student
}

func (stu *Student) ShowInfo() {

	fmt.Printf("学生名=%v 年龄=%v 成绩=%v\n", stu.Name, stu.Age, stu.Score)
}
func (stu *Student) SetScore(score int) {
	stu.Score = score
}
func (stu *Pupil) testing() {
	fmt.Println("小学生正在考试中....")
}
func (stu *Graduate) testing() {
	fmt.Println("大学生正在考试中....")
}
func main() {

	pupil := &Pupil{}
	pupil.Student.Name = "tom"
	pupil.Student.Age = 8
	pupil.testing()
	pupil.Student.SetScore(80)
	pupil.Student.ShowInfo()

	graduate := &Graduate{}
	graduate.Student.Name = "jack"
	graduate.Student.Age = 22
	graduate.testing()
	graduate.Student.SetScore(90)
	graduate.Student.ShowInfo()
}