可以看到,Cat 结构体本身没有 Name 字段,也没有去实现 Eat() 方法。唯一有的就是匿名嵌套的方式继承了 Animal 父类,至此,我们证明了 Go 通过匿名嵌套的方式实现了继承。
上面是嵌入类型实例,同样地也可以嵌入类型指针。
type Cat struct{*Animal
}
cat :=&Cat{
Animal:&Animal{
Name:"cat",},}[/code]
3.嵌入式继承机制的的局限
相比于 C++ 和 Java, Go 的继承机制的作用是非常有限的,因为没有抽象方法,有很多的设计方案可以在 C++ 和 Java 中轻松实现,但是 Go 的继承却不能完成同样的工作。
package main
import"fmt"// Animal 动物基类type Animal struct{
name string}func(a *Animal)Play(){
fmt.Println(a.Speak())}func(a *Animal)Speak()string{return fmt.Sprintf("my name is %v", a.name)}func(a *Animal)Name()string{return a.name
}// Dog 子类狗type Dog struct{
Animal
Gender string}func(d *Dog)Speak()string{return fmt.Sprintf("%v and my gender is %v", d.Animal.Speak(), d.Gender)}funcmain(){
d := Dog{
Animal: Animal{name:"Hachiko"},
Gender:"male",}
fmt.Println(d.Name())
fmt.Println(d.Speak())
d.Play()// Play() 中调用的是基类 Animal.Speak() 方法,而不是 Dog.Speak()}[/code]
运行输出:
Hachiko
my name is Hachiko and my gender is male
my name is Hachiko
[/code]
package main
import("fmt")type Animal interface{Name()stringSpeak()stringPlay()}type Dog struct{
name string
gender string}func(d *Dog)Play(){
fmt.Println(d.Speak())}func(d *Dog)Speak()string{return fmt.Sprintf("my name is %v and my gender is %v", d.name, d.gender)}func(d *Dog)Name()string{return d.name
}funcPlay(a Animal){
a.Play()}funcmain(){
d :=&Dog{"Hachiko","male"}
fmt.Println(d.Name())
fmt.Println(d.Speak())Play(d)}[/code]
运行输出:
Hachiko
my name is Hachiko and my gender is male
my name is Hachiko and my gender is male
[/code]