能否用同一接口内的其他方法实现接口方法,Go语言中如何实现?
这个需求是可以实现的,不同编程语言的实现思路不同,以下针对你提到的几种语言分别说明:
Java 实现方案
Java 8及以上版本支持接口默认方法,直接在接口内写Curve的默认实现即可,所有实现类无需额外重写Curve就能直接使用:
public interface Computable { double Sqrt(); double Abs(); // 默认方法,直接调用接口内的其他方法实现 default double Curve() { return Sqrt() + Abs(); } }
C++ 实现方案
C++中可以将Computable定义为抽象类,把Curve做成普通成员方法,仅把Sqrt和Abs声明为纯虚函数即可,子类只需要实现Sqrt和Abs就能直接继承Curve的实现:
class Computable { public: virtual double Sqrt() = 0; virtual double Abs() = 0; // 普通成员方法,已有默认实现 double Curve() { return Sqrt() + Abs(); } virtual ~Computable() = default; };
Go 实现方案
Go的接口本身不支持携带方法实现,所以需要通过组合嵌入的惯用方式实现通用逻辑复用,不需要每个实现类单独写Curve方法:
首先修正示例中的接口拼写和类型定义:
import "math" type Computable interface { Sqrt() float64 Abs() float64 Curve() float64 }
然后定义通用的Curve实现辅助结构体,嵌入Computable接口获取Sqrt、Abs的调用能力:
// CurveImpl 提供通用的Curve方法实现 type CurveImpl struct { Computable // 嵌入Computable接口,自动获得Sqrt、Abs方法 } // 实现Curve方法,通用逻辑只需写一次 func (c *CurveImpl) Curve() float64 { return c.Sqrt() + c.Abs() }
后续新增自定义的Computable实现时,只需要实现Sqrt和Abs两个方法即可,无需实现Curve:
// 自定义实现示例:MyInt type MyInt int func (m MyInt) Sqrt() float64 { return math.Sqrt(float64(m)) } func (m MyInt) Abs() float64 { if m < 0 { return float64(-m) } return float64(m) }
使用时将自定义实现包装进CurveImpl即可满足Computable接口要求:
import "fmt" func main() { var num MyInt = -4 // 包装后即可作为Computable接口实例使用 var comp Computable = &CurveImpl{num} fmt.Println(comp.Curve()) // 输出:6 (2+4) }
内容的提问来源于stack exchange,提问作者progquester
相关产品推荐
相关产品推荐

