我想为以下接口提供多种实现:
type API interface {
A()
B()
C()
}
根据我的用例,函数A和B的所有实现都应该共享完全相同的逻辑,而函数C对于不同的实现将具有不同的逻辑。
因此,我创建了以下要嵌入的通用实现:
type Common struct {}
func (c *Common) A() {}
func (c *Common) B() {}
要为上面的接口创建两个实现,我只需执行以下操作:
type FirstImpl struct { Common }
func (i *FirstImpl) C() {}
type SecondImpl struct { Common }
func (i *SecondImpl) C() {}
一切都很好,直到我发现函数C需要在函数B内部调用。请注意,函数B的逻辑在两个实现中应该仍然相同,尽管我们在B内部调用C可能会得到不同的结果。
我想知道这是否是Go中的常见模式,是否有一种优雅的方法来处理它
您想要模拟后期绑定。
实现这一点的一种方法是使用函数指针和实现的构造函数:
type CommonImpl struct {
cimpl func()
}
func (c CommonImpl) C() { c.cimpl() }
type FirstImpl struct {
CommonImpl
}
func NewFirstImpl() APIImpl {
ret:=FirstImpl{}
ret.cimpl=ret.c
return &ret
}
使用此实现,可以调用派生类型C()
。
另一种选择是将函数作为参数传递:
func (c CommonImpl) C(bfunc func()) {
}
...
x:=FirstImpl{}
x.C(x.B)
或者有一个接口:
type BIntf interface {
B()
}
func (c CommonImpl) C(b BIntf) {
}
x:=FirstImpl{}
x.C(x)