前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >20.Go面向对象-方法重写

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

作者头像
Devops海洋的渔夫
发布2022-01-17 10:32:13
1.3K0
发布2022-01-17 10:32:13
举报
文章被收录于专栏:Devops专栏

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

4 方法重写

方法重写的示例

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

代码语言:javascript
复制
// 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()
}

执行如下:

代码语言:javascript
复制
Student name=mike, age=18, gender=m
Persion name=mike, age=18, gender=m

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

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

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

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

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

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

例如以下案例:

代码语言:javascript
复制
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()
}

// 执行:
汪汪叫
喵喵叫

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 海洋的渔夫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 20.Go面向对象-方法重写
  • 4 方法重写
    • 方法重写的示例
      • 为什么要重写父类(结构体)的方法呢?
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档