1 package main 2 3 import "fmt" 4 5 // 1.定义一个"父类" 6 type Person struct { 7 name string 8 age int 9 } 10 11 // 2.定义一个"子类" 12 type Student struct { 13 Person // 结构体嵌套,模拟继承性 14 school string 15 } 16 17 // 3.方法 18 func (p Person) eat() { 19 fmt.Println("父类的方法,吃窝窝头。。") 20 } 21 22 func (s Student) study() { 23 fmt.Println("子类新增的方法,学生学习啦。。。") 24 } 25 26 // func (s Student) eat() { 27 // fmt.Println("子类重写的方法:吃炸鸡喝啤酒。。") 28 // } 29 30 func main() { 31 /* 32 OOP中的继承性: 33 如果两个类(class)存在继承关系,其中一个是子类,另一个作为父类,那么: 34 35 1.子类可以直接访问父类的属性和方法 36 2.子类可以新增自己的属性和方法 37 3.子类可以重写父类的方法(orverride,就是将父类已有的方法,重新实现) 38 39 40 Go语言的结构体嵌套: 41 1.模拟继承性:is - a 42 type A struct{ 43 field 44 } 45 type B struct{ 46 A //匿名字段 47 } 48 49 2.模拟聚合关系:has - a 50 type C struct{ 51 field 52 } 53 type D struct{ 54 c C //聚合关系 55 } 56 57 */ 58 59 // 1.创建Person类型 60 p1 := Person{name: "王二狗", age: 30} 61 fmt.Println(p1.name, p1.age) // 父类对象,访问父类的字段属性 62 p1.eat() // 父类对象,访问父类的方法 63 64 // 2.创建Student类型 65 s1 := Student{Person{"Ruby", 18}, "千锋教育"} 66 fmt.Println(s1.name) // s1.Person.name 67 fmt.Println(s1.age) // 子类对象,可以直接访问父类的字段,(其实就是提升字段) 68 fmt.Println(s1.school) // 子类对象,访问自己新增的字段属性 69 70 s1.study() // 子类新增的方法,学生学习啦。。。 71 s1.eat() // 子类重写的方法:吃炸鸡喝啤酒。。 72 s1.Person.eat() // 父类的方法,吃窝窝头。。 依然可以访问父类的方法 73 }