Golang 继承
Golang 继承
案例引入
type Person struct {
Name string
Age int
}
//Go继承使用匿名嵌套
type Student struct {
Person
sNo int
}
func (person *Person) say() {
fmt.Println("person say")
}
func (person *Person) talk() {
fmt.Println("person talk")
}
func (student *Student) work() {
fmt.Println("student work")
}
//重写Person talk 方法
func (student *Student) talk() {
fmt.Println("student talk")
}
func main() {
student := Student{Person{
"小明", 12,
}, 12}
student.say()
student.work()
student.talk()
//匿名结构体字段可以简化访问
fmt.Print(student.Name)
}
注意事项
-
结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段,方法,都可以使用
-
匿名结构体字段访问可以简化
-
当结构体和匿名结构体有相同的字段或则方法时, 采用就近原则访问, 如果希望访问匿名结构体的字段和方法, 可以通过匿名结构体名来区分
student.talk() //通过字段访问匿名结构体的方法 student.Person.talk()
-
结构体嵌入多个匿名结构体(多重继承), 如果两个匿名结构体有相同的字段和方法(同时结构体本身没有相同的字段和方法), 在访问时, 就必须指明匿名结构体名字,否则编译报错
type Person struct { Name string Age int } type Student struct { Name string } type xueza struct { Student Person } func main() { x := xueza{Student{"zs"}, Person{"ls", 10}} x.Name //报错 }
-
如果一个结构体嵌套了一个有名的结构体,这种模式就是组合, 如果时组合关系, 那么在访问组合的结构体的字段或方法时, 必须带上结构体的名字, 类似于
Java
中的嵌套类type Person struct { Name string Age int } type Student struct { p Person sNo int } func main() { s := &Student{Person{"zs", 10}, 10} //不能通过s.Name访问 fmt.Println(s.p.Name) }
特殊案例
GO支持匿名基本类型, 但是只能有一个相同类型的
type Student struct {
int //go支持匿名基本类型
sNo int
}
func main() {
s := &Student{10, 20}
fmt.Println(s)
}