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 }