从没有强制转换类型的继承结构到继承类型执行实际对象方法


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()(,但它在功能上保持不变。


延伸阅读:

  • 戈朗和继承
  • 有效围棋 - 嵌入

最新更新