首页 > 解决方案 > 如何实现功能共享相同逻辑的接口?

问题描述

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

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() {}

一切正常,直到我发现需要在函数B中调用函数C。请注意,函数B的逻辑在两个实现中应该仍然相同,尽管我们可能会在B中调用C得到不同的结果。

我想知道这是否是 Go 中的一种常见模式,以及是否有一种优雅的方式来处理它。

标签: oopgodesign-patternsinterface

解决方案


您想模拟后期绑定。

实现这一点的一种方法是使用函数指针和实现的构造函数:

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)

推荐阅读