Flutter开发App的未来及其在各行业的应用潜力分析
514
2022-11-22
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~