例如,一个名为 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 中,很容易解析它。但谁能告诉如何实现它?
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() 函数而不是方法。