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

本文详细探讨了Go语言中方法重写的概念,通过子类(如Student)继承并重写父类(Person)的方法PrintInfo,展示了如何实现功能的定制。重点讲解了重写的原因和在动物类及其子类(Dog和Cat)中实际应用的例子,揭示了面向对象编程中灵活性的重要性和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()
}

// 执行:
汪汪叫
喵喵叫

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海洋的渔夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值