GO接口的多态性

How*_*ame 1 polymorphism class go

我试图在GO中实现这种多态性

type Discoverer interface {
    Discover() string
}

type A struct {
}

func (obj A) GetTest() string {
    return "im in A"
}

type B struct {
    A
}

func (obj B) GetTest() string {
    return "im in B"
}

func (obj A) Discover() string {
    return obj.GetTest()
}

func main() {
    a := A{}
    b := B{}

    fmt.Println(a.Discover())
    fmt.Println(b.Discover())
}
Run Code Online (Sandbox Code Playgroud)

现在我进入输出

im in A
im in A
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:可以在输出中看到

im in A
im in B
Run Code Online (Sandbox Code Playgroud)

没有"覆盖"发现B?

func (obj B) Discover() string {
    return obj.GetTest()
}
Run Code Online (Sandbox Code Playgroud)

为什么?我有很多的结构小方法(类),发现漂亮的所有结构是相同的,所以我想避免复制和在每个结构粘贴发现(类)

去游乐场https://play.golang.org/p/nYc2hc3UbG

提前致谢!

eva*_*nal 7

不,你要嵌入AB.B没有定义Discover,因此A始终调用版本on .该方法具有类型的接收器,A并且AB知道或嵌入其中的事实B.因此A只能称它为自己的版本GetTest().

B满足发现界面的唯一原因是它A嵌入了.它间接地实现它.如果您想要启用该功能B,则必须在其上进行定义B.这根本不是多态,它的组成.B不是A,BA.如果你想要多态,你可以使用接口并实现它们.B是可发现的,但仅仅因为它有一个A.

我认为这仅仅是为了示例,但实际上你甚至没有理由拥有这种Discovery方法.您的界面应该只需要GetTest.不要混淆嵌入和继承.Go中没有继承.如果你想要多态行为,你可以通过实现接口来实现它,你不能像这样偷工减料,因为嵌入式和embeddor之间的关系不是继承,没有基类或"覆盖".