是否可以通过此接口中的其他方法实现一个接口中的方法?

Pro*_*ter -1 interface go

例如,一个名为 Computable 的接口,它有两个方法:Sqrt()Abs()

如果我想添加一个名为Curve()计算 sqrt 和 abs 总和的方法。

type Computable interace { 
    Sqrt() number  // method 1
    Abs() number   // method 2
    Curve() number // method should call Sqrt() + Abs()
}
Run Code Online (Sandbox Code Playgroud)

显然,不需要为所有接口实现重写第三个方法。在 C++/Java 中,很容易解析它。但谁能告诉如何实现它?

icz*_*cza 7

Go 中没有默认方法实现。

在您的情况下,最简单的解决方案是移出Curve()界面,并将其实现为一个简单的函数:

type Computable interface {
    Sqrt() number // method 1
    Abs() number  // method 2
}

func Curve(c Computable) number {
    return c.Sqrt() + c.Abs()
}
Run Code Online (Sandbox Code Playgroud)

如果它必须是接口的一部分,那么您可以创建一个Curve()使用值Computable作为其“源”的实现:

type curveImpl struct {
    Computable
}

func (c curveImpl) Curve() number {
    return c.Sqrt() + c.Abs()
}
Run Code Online (Sandbox Code Playgroud)

希望实现的具体类型Computable可以 embed curveImpl,但要使其工作,必须正确初始化:

type Foo struct {
    curveImpl
}

func (Foo) Sqrt() number { return 2.0 }
func (Foo) Abs() number  { return 4.0 }

func main() {
    f := Foo{}
    f.curveImpl = curveImpl{f}

    fmt.Println(f.Curve())
}
Run Code Online (Sandbox Code Playgroud)

上面的示例输出6(在Go Playground上尝试)。

正如您所看到的,这项工作涉及一些麻烦。所以在这种情况下,是否值得值得怀疑。如果Curve()这很简单,我宁愿在需要的地方实施它。如果Curve()要复杂得多,那么也许这种权衡是值得的。

再说一遍:最简单的方法是在这里使用Curve() 函数而不是方法

  • 如果它不需要成为接口的一部分,则单个实用程序函数中没有重复。 (2认同)