Go之面向对象编程之继承

Golang的继承与java和php不太一样,如php继承需要用到extends关键字,而Golang使用的是匿名继承或有名继承。

二:简单举例

 

package main

import (
	"fmt"
)
type Brand struct{
	Name string

}

type Goods struct{
	Brand
	Goods_name string
}

func main() {
	var extends Goods
	extends.Brand.Name = "伊利"
	extends.Goods_name= "纯牛奶"
	fmt.Println(extends)
}
结果
[ `go run extends.go` | done ]
	{{伊利} 纯牛奶}

 继承的好处有,提高代码的复用性,程序的扩展和维护更加简单

三:继承的使用细节

①:结构体可以使用继承结构体的所有字段,无论首字母大写还是小写。

package main

import (
	"fmt"
)
type Person struct{
	Name string
	age int
}

func (p Person) say() {
	fmt.Printf("我的名字叫%v,今年%v岁", p.Name, p.age)
}

type Anna struct{
	Person

}

func main() {
	var anna Anna
	anna.Person.Name = "anna"
	anna.Person.age = 18
	anna.say()
}
结果
[ `go run extends.go` | done ]
	我的名字叫anna,今年18岁

 ②:匿名继承方法访问方式可以简化

 修改①中的例子,将访问方式简化

func main() {
	var anna Anna
	anna.Name = "anna"
	anna.age = 18
	anna.say()
}

 ③:当结构体和匿名结构体有相同字段时,结构体变量采用就近原则来方法字段,如果希望采用匿名的字段,使用详细访问方式即可

package main

import (
	"fmt"
)
type Person struct{
	Name string
	age int
}

func (p Person) Say() {
	fmt.Printf("我的名字叫%v,今年%v岁", p.Name, p.age)
}

type Anna struct{
	Person
	age int
}

func (a Anna) AnnaSay() {
	fmt.Printf("我今年%v岁", a.age)
}

func main() {
	var anna Anna
	anna.Name = "anna"
	anna.age = 18
	anna.Say()
	fmt.Println()
	anna.AnnaSay()
}
结果
[ `go run extends.go` | done ]
	我的名字叫anna,今年0岁
	我今年18岁

 备注:anna访问的流程如下 先查找Anna结构体是否有需要的字段,有就是要Anna结构体,否则往Anna的匿名结构体Person上查找,找到就使用该结构体的字段,否则继续往Person的匿名结构体查找,直到按照就近原则找到为止,没找到就报错。

④:当有两个匿名结构体,且两个匿名结构体有相同的字段名称而结构体如Anna没有该形同字段时,必须指定匿名结构体名称,否则报错。

package main

import (
	// "fmt"
)
type Person struct{
	Name string
	age int
}

type Animal struct{
	Name string
	age int
}

type Anna struct{
	Person
	Animal
}

func main() {
	var anna Anna
	//错误的写法
	anna.age = 2
	//正确的写法
	anna.Person.age = 3
	anna.Animal.age = 2
}

 ⑤:结构体继承有名结构体时,这种方式就是组合,访问组合的字段时,必须带上结构体名称

type Anna struct{
	p Person
}

func main() {
	var anna Anna
	anna.p.age = 2
}

 在第④基础上修改。

⑥:在创建结构体变量时可以同时指定匿名结构体的字段值

package main

import (
	"fmt"
)
type Person struct{
	Name string
	age int
}


type Anna struct{
	Person
}

func main() {
	var anna Anna = Anna{Person{"anna",18}}
	fmt.Println(anna)
	var louis Anna = Anna{Person{
			Name : "louis",
			age :18,
		},}
	fmt.Println(louis)
}
结果
[ `go run extends.go` | done ]
	{{anna 18}}
	{{louis 18}}

 ⑦:多重继承,在第④中有举例,略。

posted @ 2019-01-13 17:04  louis-sun  阅读(606)  评论(0)    收藏  举报