在 Go 中调用嵌入式类型的重载方法的正确方法

Proper way to call overloaded method of embedded type in Go

我有一个界面:

 package pkg
 type BaseInterface interface {
     func Nifty() bool
     func Other1() 
     func Other2()
     ...
     func Other34123()
 }

以及实现它的结构:

 package pkg
 type Impl struct {}
 func (Impl) Nifty() bool { ... }

然后出现了另一个结构,它想要嵌入第一个并做它自己的 Nifty():

 package myOtherPackage
 import "pkg"
 type ImplToo struct {
     *pkg.Impl
 }
 func (it ImplToo) Nifty() bool { ... something else ... }

这有点像 class OOP 语言中带有方法覆盖的继承。我想知道如何做 implToo.super().Nifty() 的等价物 - 也就是说,从 ImplToo Nifty() 实现中调用 pkg.Impl Nifty() 实现。

it 上使用什么样的正确转换才能完成此操作?我尝试的每件事要么在 ImplToo 的 Nifty() 上产生无限递归,要么产生一些编译器错误,例如:

invalid type assertion: (&it).(BaseInterface) (non-interface type *it on left)

... 或许多变体。

您正在寻找;

 type ImplToo struct {
     pkg.Impl
 }

func (it ImplToo) Nifty() bool { return it.Impl.Nifty() }

您对指针的使用不一致,这可能是您问题的一部分(不是肯定的)。如果你想让嵌入类型成为指针,那么让你的方法接收类型也成为指针以避免这个问题。

如果您想在嵌入式类型中显式使用方法,您可以使用通常具有 属性 名称的类型来引用它。

@evanmcdonnal 说的。你的 Nifty 要么需要接受指导,要么不需要。如果您将指针嵌入到 pkg.Impl 那么您的 Nifty 函数需要接受一个结构指针。如果你的 Nifty 函数不接受指针,那么你的嵌入类型不应该是指针。

这是一个有效的嵌入式指针。

·>猫main.go

package main

import (
    "cs/pkg"
    "fmt"
)

type ImplToo struct {
    *pkg.Impl
}

func (it *ImplToo) Nifty() bool {
    fmt.Printf("Impl.Nifty() is %t\n", it.Impl.Nifty())
    return false
}

func main() {
    i := new(ImplToo)
    fmt.Println(i.Nifty())
}

·>猫cs/pkg/test.go

package pkg

type BaseInterface interface {
    Nifty() bool
}

type Impl struct{}

func (i *Impl) Nifty() bool {
    return true
}

输出:

Impl.Nifty() is true
false