Go的面向对象编程特性

image.png
image.png

封装

image.png
image.png

继承

go中使用匿名结构体来实现继承!

  1. 结构体可以使用嵌套结构体内所有字段和方法
  2. 匿名结构体字段访问可以简化

    image.png

  3. 如果结构体与匿名结构体含有相同的字段或方法,编译器采用就近原则

image.png

  1. 结构体嵌入多个匿名结构体时,如果两个嵌入的匿名结构体含有相同字段或方法(同时鸡骨头提本身没有同名字段方法),在访问时,必须值命匿名结构体名字,否则编译报错。

image.png

  1. 如果一个结构体嵌套了一个有名结构体,那么这种模式就是组合,租还关系在访问时必须带上结构体名字

image.png

  1. 嵌套匿名结构体后,也可以在创建结构体变量时,直接指定各个匿名结构体字段的值。

image.png
image.png

  1. 如果一个结构体有一个基本类型的匿名结构体,那么就只能拥有这种类型的字段一个
  1. package BasicLearn
  2. import "fmt"
  3. type Student struct { //公共父类 Student
  4. Name string
  5. Age int
  6. Score int
  7. }
  8. func(stu *Student)ShowInfo(){
  9. fmt.Printf("学生名=%v 年龄=%v 成绩=%v\n",stu.Name,stu.Age,stu.Score)
  10. }
  11. func(stu *Student)SetScore(score int){
  12. stu.Score = score
  13. }
  14. //子类小学生
  15. type Pupil struct{
  16. Student //嵌入Student匿名结构体,相当于继承
  17. }
  18. func(p *Pupil)testing(){
  19. fmt.Println("小学生正在考试呢!!!")
  20. }
  21. //子类大学生
  22. type Graduate struct {
  23. Student
  24. }
  25. func(g *Graduate)testing(){
  26. fmt.Println("大学生正在考试呢!!!")
  27. }
  28. func TestExtend() {
  29. pupil := &Pupil{}
  30. pupil.Student.Score = 80
  31. pupil.Student.Name = "大头"
  32. pupil.Student.Score = 100
  33. fmt.Println(*pupil)
  34. //1. 结构体可以使用嵌套结构体内所有字段和方法
  35. //2. 匿名结构体字段访问可以简化
  36. pupil.Score = 88
  37. pupil.Name = "大5头"
  38. pupil.Score = 90
  39. fmt.Println(*pupil)
  40. }

多重继承

image.png
image.png

image.png

多态

多态主要通过接口来体现

  • 多态参数

可以定义方法接受接口类型,不同实现的结构体会调用自己的对应方法。

  • 多态数组

可以定义一个接口数组,数组内可以存储实现了接口的不同结构体。