【问题标题】:How to implement an interface with functions sharing the same logic?如何实现功能共享相同逻辑的接口?
【发布时间】:2020-07-25 14:19:59
【问题描述】:

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

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 得到不同的结果。。 p>

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

【问题讨论】:

  • play.golang.com/p/8EtJWUmtryN 这是一种方式,但我不会称之为优雅。
  • @mkopriva 谢谢!这非常接近我想要的。理想情况下,我想像 &FirstImpl{} 一样简单地实例化对象,而不需要为每个实现重复 impl.Common.c = impl。

标签: oop go design-patterns interface


【解决方案1】:

您想模拟后期绑定。

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

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)

【讨论】:

  • 我认为这与@mkopriva 在上面的评论中建议的想法大致相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2010-12-18
相关资源
最近更新 更多