如何实现功能共享相同逻辑的接口



我想为以下接口提供多种实现:

type API interface {
A()
B()
C()
}

根据我的用例,函数AB的所有实现都应该共享完全相同的逻辑,而函数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)

最新更新