我正在编写一段依赖于某些实现的代码。
我想将实现与我的代码分离,并使实现尽可能独立。
我想通过使用接口而不是具体类型来实现这种方法,如下所示:
package mypackage
type MyType interface {
Title() string
Price() int
}
type TypeGetter interface {
GetType() MyType
}
func MyHandler(tg TypeGetter) {
t := tg.GetType()
fmt.Printf("Title: %s, Price: %d", t.Title(), t.Price())
}
一个实现可能是这样的:
package external
// CustomType implicitly implements the MyType interface
type CustomType struct {
title string
price int
}
func (t CustomType) Title() string { return t.title }
func (t CustomType) Price() int { return t.price }
// CustomTypeGetter implicitly implements the TypeGetter interface. Or is it???
type CustomTypeGetter struct {
}
func (g CustomTypeGetter) GetType() CustomType {
return CustomType{"Hello", 42}
}
然后,代码将执行以下操作:
package main
import "mypackage"
import "external"
func main() {
tg := external.CustomTypeGetter{}
mypackage.MyHandler(tg) // <--- the compiler does not like this
}
我希望这个例子能说明问题:我在“mypackage”和“external”包之间没有耦合,它可以被替换,代替我的模拟进行测试等。
问题:编译器抱怨调用MyHandler有一个实现的对象:
func GetType() CustomType,而不是:
func GetType() MyType
我找到的唯一解决方案是将接口声明(MyType和TypeGetter)移动到第三个包,然后“mypackage”和“external”包都可以使用它。
但我想避免这种情况。
Go 的接口隐式实现的概念是不是与第三个通用包的想法相矛盾?
有没有办法实现这样的事情,而不将两个包绑定在一起?
噜噜哒
人到中年有点甜
相关分类