method也叫方法,Go语言中支持method的继承和重写。
一、method继承
method是可以继承的,如果匿名字段实现了⼀个method,那么包含这个匿名字段的struct也能调⽤该匿名结构体中的method。
案例如下:
//myMethod02.go
// myMehthodJicheng2 project main.go
package main
import (
"fmt"
)
type Human struct {
name, phone string
age int
}
type Student struct {
Human
school string
}
type Employee struct {
Human
company string
}
func (h *Human) SayHi() {
fmt.Printf("大家好! 我是%s, 我%d岁, 我的电话是: %s\n",
h.name, h.age, h.phone)
}
func main() {
s1 := Student{Human{"Anne", "15012349875", 16}, "武钢三中"}
e1 := Employee{Human{"Sunny", "18045613416", 35}, "1000phone"}
s1.SayHi()
e1.SayHi()
}
效果如下:
图(1) 子类调用父类的method
二、method重写
子类重写父类的同名method函数;调用时,是先调用子类的method,如果子类没有,才去调用父类的method。
案例如下:
//myMethod2.go
// myMehthodJicheng2 project main.go
package main
import (
"fmt"
)
type Human struct {
name, phone string
age int
}
type Student struct {
Human
school string
}
type Employee struct {
Human
company string
}
func (h *Human) SayHi() {
fmt.Printf("大家好! 我是%s, 我%d岁, 我的电话是: %s\n",
h.name, h.age, h.phone)
}
func (s *Student) SayHi() {
fmt.Printf("大家好! 我是%s, 我%d岁, 我在%s上学, 我的电话是: %s\n",
s.name, s.age, s.school, s.phone)
}
func (e *Employee) SayHi() {
fmt.Printf("大家好! 我是%s, 我%d岁, 我在%s工作, 我的电话是: %s\n",
e.name, e.age, e.company, e.phone)
}
func main() {
s1 := Student{Human{"Anne", "15012349875", 16}, "武钢三中"}
e1 := Employee{Human{"Sunny", "18045613416", 35}, "1000phone"}
s1.SayHi()
e1.SayHi()
}
效果如下:
图(2) 子类调用自身的method