亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《是否可以通过该接口中的其他方法来实现一个接口中的方法?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。
问题内容
例如,名为 computable 的接口,它有两个方法:sqrt() 和 abs()。
如果我想添加一个名为curve()的方法来计算sqrt和abs之和。
type Computable interace {
Sqrt() number // method 1
Abs() number // method 2
Curve() number // method should call Sqrt() + Abs()
}
显然,所有接口实现都不需要重写第三个方法。在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()
}
如果它必须是接口的一部分,那么您可以创建 curve() 的单个实现,该实现使用 computable 的值作为其“源”:
type curveimpl struct {
computable
}
func (c curveimpl) curve() number {
return c.sqrt() + c.abs()
}
希望实现 computable 的具体类型可以嵌入 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())
}
上面的示例输出 6(在 Go Playground 上尝试一下)。
正如您所看到的,完成这项工作涉及一些麻烦。所以在这种情况下,是否值得值得怀疑。如果 curve() 这么简单,我宁愿在需要的地方实现它。如果 curve() 会复杂得多,那么也许这种权衡是值得的。
再说一遍:最简单的方法是使用 curve() 函数,而不是这里的方法。
亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《是否可以通过该接口中的其他方法来实现一个接口中的方法?》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。
问题内容
例如,名为 computable 的接口,它有两个方法:sqrt() 和 abs()。
如果我想添加一个名为curve()的方法来计算sqrt和abs之和。
type Computable interace {
Sqrt() number // method 1
Abs() number // method 2
Curve() number // method should call Sqrt() + Abs()
}
显然,所有接口实现都不需要重写第三个方法。在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()
}
如果它必须是接口的一部分,那么您可以创建 curve() 的单个实现,该实现使用 computable 的值作为其“源”:
type curveimpl struct {
computable
}
func (c curveimpl) curve() number {
return c.sqrt() + c.abs()
}
希望实现 computable 的具体类型可以嵌入 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())
}
上面的示例输出 6(在 Go Playground 上尝试一下)。
正如您所看到的,完成这项工作涉及一些麻烦。所以在这种情况下,是否值得值得怀疑。如果 curve() 这么简单,我宁愿在需要的地方实现它。如果 curve() 会复杂得多,那么也许这种权衡是值得的。
再说一遍:最简单的方法是使用 curve() 函数,而不是这里的方法。