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

时间:2018-06-20 21:45:31

标签: inheritance go

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"
}

Playground

当我从继承的struct执行方法并在其中执行另一个struct方法时-是从继承的struct执行的方法,而不是实际的对象类型。

1 个答案:

答案 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>


进一步阅读: