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"
}
操场
当我从继承的结构中执行方法并执行另一个结构方法时 - 是从继承的结构执行方法,而不是实际的对象类型。
正如 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()
(,但它在功能上保持不变。
延伸阅读:
- 戈朗和继承
- 有效围棋 - 嵌入