07-面向对象

封装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main

import "fmt"

// 类名、属性名、方法名、首字母大写代表其他包可以访问,首字母小写代表私有,只有本包内可以使用
type Hero struct {
Name string
Ad int
Level int
}

// 如果不写*Hero,这里传进去的一个副本,如果想在函数内对其进行修改,要用*Hero
func (this Hero) Show() {
// 副本
fmt.Println("Name : ", this.Name)
fmt.Println("Ad : ", this.Ad)
fmt.Println("Level : ", this.Level)
}

func (this Hero) GetName() string {
return this.Name
}

func (this *Hero) SetName(name string) {
// 这样才是当前对象
this.Name = name
}

func main() {
hero := Hero{ Name: "freezing", Ad: 33, Level: 1}
hero.Show()
hero.SetName("rebecca")
hero.Show()

}

继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package main

import "fmt"

type Human struct {
name string
age int
}

func (this *Human) Walk() {
fmt.Println("Human walk .....")
}

func (this *Human) Eat() {
fmt.Println("Human eat .....")
}


type Superhero struct {
// 继承Human写法
Human
level int
}

// 重定义(方法重写)父类方法
func (this *Superhero) Eat() {
fmt.Println("Superhero eat .....")
}

// 子类的新方法
func (this *Superhero) Fly() {
fmt.Println("Superhero fly .....")
}

func main() {
human := Human{"freezing", 20}
human.Eat()
human.Walk()
superhero := Superhero{Human{"rebecca", 30}, 1}
superhero.Walk() // 父类方法
superhero.Eat() // 子类方法
superhero.Fly() // 子类方法
// 另外一种初始化对象的方法
var s Superhero
s.age = 24
s.level = 1
s.name = "cookie wan"
}

多态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package main

import "fmt"

// interface是一个指针,一个接口实现两个具体的类
type Animal interface {
Sleep()
GetColor() string // 获取动物颜色
GetType() string // 获取动物种类
}

type Cat struct{
// 继承需要把类写在里面,实现多态不需要
color string
}


//实现多态,只需要把这些接口里面的方法实现就行,必须完全实现接口里面的全部东西
func (this *Cat) Sleep() {
fmt.Println("cat is sleep .....")
}

func (this *Cat) GetColor() string{
return this.color
}

func (this *Cat) GetType() string{
return "小猫"
}


type Dog struct{
// 继承需要把类写在里面,实现多态不需要
color string
}

//实现多态,只需要把这些接口里面的方法实现就行,必须完全实现接口里面的全部东西
func (this *Dog) Sleep() {
fmt.Println("Dog is sleep .....")
}

func (this *Dog) GetColor() string{
return this.color
}

func (this *Dog) GetType() string{
return "小猫"
}

func showAnimal(animal Animal){
animal.Sleep()
fmt.Println(animal.GetType(), "的颜色:", animal.GetColor())

}

func main() {
var animal Animal // 接口的数据类型,父类指针
animal = &Cat{"Green"}
// cat := Cat{"Green"}
showAnimal(animal)
animal = &Dog{"Red"}
showAnimal(animal)
// animal.Sleep() // 调用的是dog的sleep,和catsleep并不相同,就是多态的体现
// fmt.Println("狗的颜色:", animal.GetColor())
}

07-面向对象
https://flepeng.github.io/021-Go-01-course-07-面向对象/
作者
Lepeng
发布于
2024年11月1日
许可协议