如何在不同包中实现具有相同方法签名的多个接口
假设您需要实现在不同包中定义且方法签名冲突的接口。这可能很有挑战性,但 Go 提供了一个解决方案。
让我们考虑一个例子:
在包 A 中:
package A type Doer interface { Do() string } func FuncA(doer A.Doer) { // Use doer.Do() here to implement functionality }
B包中:
package B type Doer interface { Do() string } func FuncB(doer B.Doer) { // Use doer.Do() here to implement functionality }
在你的主包中:
package main import ( "path/to/A" "path/to/B" ) type C int // C implements both A.Doer and B.Doer, but the implementation of Do() aligns with A. func (c C) Do() string { return "C implements both A and B" } func main() { c := C(0) A.FuncA(c) // Acceptable as C implements A.Doer B.FuncB(c) // Error, as the Do() implementation in C doesn't meet B.Doer requirements }
解决方案:
为了解决这个冲突,Go 提供了一个简洁的方法:
if _, ok := obj.(A.Doer); ok { }
这允许您在运行时验证一个对象(接口类型)是否符合另一个接口类型(例如 A.Doer)。
然而,OP 强调了进一步的复杂性:包 A 和包 B 中 Do() 实现的逻辑是不同的。为了解决这个问题,请围绕您的对象创建包装器:
通过实现不同的包装器,您可以根据预期的接口类型(A.Doer 或B.多尔)。这消除了在原始 C 对象上使用单个 Do() 方法的需要,这将很难实现这两个逻辑。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3