6.6. 第4节:方法重写
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)
}