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

网友投稿 514 2022-11-22

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

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=mPersion 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()}// 执行:汪汪叫喵喵叫

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

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:11.Go复合类型-字符串
下一篇:21.Go面向对象-方法值与方法表达式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~