package main
import (
"fmt"
)
type IA interface {
Parse()
Name() string
}
type A struct {
IA
}
func (a *A) Name() string {
return "AName"
}
func (a *A) Parse() {
fmt.Println("A-" + a.Name())
}
type B struct {
A
}
func (b *B) Name() string {
return "BName"
}
func main() {
a := &A{}
b := &B{}
a.Parse()
b.Parse() // I would like to see "A-BName"
}
当我从继承的struct执行方法并在其中执行另一个struct方法时-是从继承的struct执行的方法,而不是实际的对象类型。
答案 0 :(得分:1)
正如JimB所说,Go中没有像其他语言中那样适当的继承。为了直观地显示这一点,让我们在main()
中使用代码:
a := &A{}
b := &B{}
a.Parse()
b.Parse()
当调用a.Parse()
时,Go编译器会检查a
是否具有方法Parse()
,并且确实存在。因此它将调用方法a.Parse
。
当调用b.Parse()
时,Go编译器会检查b
是否具有方法Parse()
,但没有-但结构中的嵌入式字段却具有!因此,它仅使用该字段中的方法,因此称为b.A.Parse()
。实际上,您可以将B更改为此:
type B struct {
A A
}
唯一的区别是b.Parse()
不起作用,您必须手动指定.A
(因此b.A.Parse()
),但功能上保持相同。 / p>
进一步阅读: