在实现相同接口的多个结构上定义方法

时间:2014-12-12 21:30:45

标签: go

采取以下代码:

type A struct { … }
func (a *A) Attr() int { … }

type B struct { … }
func (b *B) Attr() int { … }

type I interface{
  Attr() int
}

func (m that implements I) Process() int {
  do something with m.Attr()
}

func main() {
  a := A{}
  a.Process()
  b := B{}
  b.Process()
}

无法在接口上定义方法,因此m不能是I类型。我尝试在AB上使用匿名字段,但Attr特定于关联的结构,因此无法在匿名字段上实现。

我希望避免在Process()A上复制/粘贴B方法,因为它完全相同。我可以简单地定义

func Process(m I) int { … }
相反,但它不是很优雅。

你将如何继续这样做?

1 个答案:

答案 0 :(得分:1)

Go目前无法实现。虽然您可以通过在结构中嵌入另一种类型来向多种类型引入常用方法,但这些方法不了解它们嵌入的类型。

这种模式的常用Go成语是使用一个函数。例如,标准库中的sort package。它defines an interface由在容器(LenLessSwap上实现排序算法所需的方法组成。但是,实际排序算法is exposed as a function采用实现接口的参数。