0
点赞
收藏
分享

微信扫一扫

20.Go面向对象-方法重写

20.Go面向对象-方法重写

4 方法重写

方法重写的示例

在上一章节的案例中,子类(结构体)可以继承父类中的方法,但是,如果父类中的方法与子类的方法是重名方法会怎样呢?

// Person类
type Person struct {
name string // 名字
age int // 年龄
gender byte // 性别,字符类型
}

func (p *Person) PrintInfo() {
fmt.Printf("Persion name=%s, age=%d, gender=%c\n", p.name, p.age, p.gender)
}

// Student类
type Student struct {
Person // 继承Person
id int
addr string
}

// Student实现Person类的同名方法PrintInfo,也就是方法的重写
func (p *Student) PrintInfo() {
fmt.Printf("Student name=%s, age=%d, gender=%c\n", p.name, p.age, p.gender)
}

func main() {
s := Student{Person{"mike", 18, 'm'}, 666, "beijing"}
// 就近原则:先找到本类的方法,找不到再用继承的方法
s.PrintInfo()
// 显示调用继承的方法
s.Person.PrintInfo()
}

执行如下:

Student name=mike, age=18, gender=m
Persion name=mike, age=18, gender=m

如果子类(结构体)中的方法名与父类(结构体)中的方法名同名,在调用的时候是先调用子类(结构体)中的方法,这就方法的重写。

所谓的重写:就是子类(结构体)中的方法,将父类中的相同名称的方法的功能重新给改写了。

为什么要重写父类(结构体)的方法呢?

通常,子类(结构体)继承父类(结构体)的方法,在调用对象继承方法的时候,调用和执行的是父类的实现。

但是,有时候需要对子类中的继承方法有不同的实现方式。

例如,假设动物存在“跑”的方法,从中继承有狗类和马类两个子类,但是它们的跑是不一样的。

例如以下案例:

type Animal struct {
age int
}

func (p *Animal) Brak() {
fmt.Println("汪汪叫")
}

type Dog struct {
Animal
name string
}

type Cat struct {
Animal
name string
}

func (c *Cat) Brak() {
fmt.Println("喵喵叫")
}

func main() {
var dog Dog
dog.Brak()

var cat Cat
cat.Brak()
}

// 执行:
汪汪叫
喵喵叫

在该案例中,定义了一个动物类(结构体),并且有一个叫的方法,接下来小狗的类(结构体)继承动物类,小猫的类继承动物类,它们都有了叫的方法,但是动物类中的叫的方法无法满足小猫的叫的要求,只能重写。



举报

相关推荐

0 条评论