6.6. 第4节:方法重写

未匹配的标注
本文档最新版为 2023,旧版本可能放弃维护,推荐阅读最新版!

4. 方法重写

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

package main

import "fmt"

type person8 struct {
    id   int
    name string
    age  int
    sex  string
}

type student8 struct {
    person8

    class int
    score int
    addr  string
}

func (p *person8) SayHello() {
    fmt.Printf("大家好我是:%s,我今年%d岁,我是%s生\n", p.name, p.age, p.sex)
}

//子类对象和父类对象的方法名重名
func (s *student8) SayHello() {
    fmt.Printf("大家好我是:%s,我今年%d岁,我是%s生,我的班级是%d,我的成绩是%d\n",
        s.name, s.age, s.sex, s.class, s.score)

}
func main() {

    stu := student8{person8{1001, "甘夫人", 32, "女"}, 112, 80, "巴蜀"}

    //子类对象方法  采用就进原则 使用子类对象方法
    //如果子类和父类有相同的方法名 叫方法重写
    stu.SayHello()
    //父类对象方法
    stu.person8.SayHello()
    fmt.Println(stu.SayHello)
    fmt.Println(stu.person8.SayHello)
}

2.5 方法值和方法表达式

package main

import "fmt"

type student9 struct {
    name string
    age  int
    sex  string
    addr string
}

func test() {
    fmt.Println("hello world")
}

//func ()  函数类型
func (s *student9) PrintInfo() {
    fmt.Println(*s)
}

//func (string,int,string,string) 函数类型
func (s *student9) EditInfo(name string, age int, sex string, addr string) {
    s.name = name
    s.sex = sex
    s.age = age
    s.addr = addr
}
func main() {
    var s student9
    //通过方法为对象赋值
    //s.EditInfo("武则天", 32, "女", "洛阳")

    //fmt.Printf("%T\n",s.EditInfo)
    f := s.EditInfo

    //隐藏接收调用方法方式
    f("武则天", 32, "女", "洛阳")

    fmt.Println(s)

    //虽然对象相同 但是函数类型不同 不能赋值
    //f=s.PrintInfo//err

}
func main1201() {

    stu := student9{"甄姬", 32, "女", "许昌"}

    //stu.PrintInfo()

    //函数类型定义的变量
    //对象的方法和函数都具有相同的数据类型
    var f func()
    f = stu.PrintInfo
    f()

    f = test
    f()

    fmt.Printf("%T\n", f)
}

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
wangchunbo
讨论数量: 0
发起讨论 只看当前版本


暂无话题~