Golang面向对象编程继承的特点

1) 结构体可以使用嵌套匿名结构体所有字段和方法,即:首字母大写或者小写的字段、方法,都可以使用。

2) 匿名结构体字段访问可以进简化。

package main
import "fmt"
type A struct {
	Name string
	age uint8
}
func (a *A) SayOk() {
	fmt.Println("A SayOk", a.Name)
}
func (a *A) sayHello() {
	fmt.Println("A sayHello", a.Name)
}
type B struct {
	A
}
func main() {
    var b B
    b.A.Name = "tom"
    b.A.age = 19
    b.A.SayOk()
    b.A.sayHello()
    //上面的写法可以简化为
    b.Name = "tom"
    b.age = 19
    b.SayOk()
    b.sayHello()
}
/* 
输出:
A SayOk tom
A sayHello tom
A SayOk tom
A sayHello tom
小结
当我们直接通过b访问字段或者方法时,其执行流程如下,
例如b.Name,编译器会先看b对应的类型中有没有Name,如果有则直接调用B类型的Name字段;
如果没有Name字段,就去看B中签入的匿名结构体A有没有声明Name字段,如果有就调用,如果没有就继续查找,如果都没找到就报错。
 */

3) 当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近原则访问,如果希望访问匿名结构体中的字段和方法,可以通过匿名结构体名来区分。

package main
import "fmt"
type A struct {
	Name string
	age uint8
}
func (a *A) SayOk() {
	fmt.Println("A SayOk", a.Name)
}
func (a *A) sayHello() {
	fmt.Println("A sayHello", a.Name)
}
type B struct {
	A
	Name string
}
func (b *B) SayOk() {
	fmt.Println("B SayOk", b.Name)
}
func main() {
    var b B
    b.Name = "jack"
    b.A.Name = "scott"
    b.age = 100
    b.SayOk()
    b.sayHello()
}
/*
输出:
B SayOk jack
A sayHello scott
*/

4) 结构体嵌入两个(或多个)匿名结构体,如果两个匿名结构体有相同的字段和发放(同时)结构体本身没有同名的字段和方法,在访问时,就必须明确指定匿名结构体的名字,否则编译报错。

5) 如果一个struct嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字。

6) 嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定某个匿名结构体的字段值。

package main
import "fmt"
type Goods struct {
	Name string
	Price float64
}
type Brand struct {
	Name string
	Address string
}
type TV struct {
	Goods
	Brand
}
type TV2 struct {
	*Goods
	*Brand
}
func main() {
	tv1 := TV{Goods{"电视机01", 1234.56}, Brand{"海尔", "山东青岛"}}
	tv2 := TV{
		Goods{"电视机02", 4353.12},
		Brand{"创维", "四川成都"},
	}
	tv3 := TV{
		Goods{
			"电视机03",
			5555.55,
		},
		Brand{
			Address : "北京",
			Name : "小米",
		},
	}
	tv4 := TV2{&Goods{"电视机04", 9999.00}, &Brand{"华为智慧屏", "广东深圳"}}
    fmt.Println(tv1)
	fmt.Println(tv2)
	fmt.Println(tv3)
	fmt.Println(*tv4.Goods, *tv4.Brand)
}
/*
输出:
{{电视机01 1234.56} {海尔 山东青岛}}
{{电视机02 4353.12} {创维 四川成都}}
{{电视机03 5555.55} {小米 北京}}
{电视机04 9999} {华为智慧屏 广东深圳}
*/

7) 如果一个结构体嵌套了多个匿名结构体,那么改结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现了多重继承。为了保证代码的简洁性,建议大家尽量不要使用多重继承

共有 0 条评论

Top