【问题标题】:Interface and Implementation接口和实现
【发布时间】:2020-01-31 11:32:11
【问题描述】:

在下面的代码sn -p -

type Input interface {
    Name() string
}

type Abc interface {
    Do(Input)
}

type InputImpl struct {
}

func (InputImpl) Name() string {
    return "sample-impl"
}

type AbcImpl struct {
}

func (abcImpl *AbcImpl) Do(input Input){
    // do something
}

AbcImpl struct 是Abc 接口的实现,但是像这样改变最后一个函数 -

func (abcImpl *AbcImpl) Do(input InputImpl){
    // do something
}

现在AbcImpl 不再实现Abc,尽管InputImpl 正在实现Input 接口!

我是否遗漏了什么,或者必须具有 完全相同的签名(不是事件 Impls)作为合法实现的接口?

【问题讨论】:

  • 是的,必须具有完全相同的签名。你有什么理由要这样定义它吗?
  • @bereal 好的,我试图在我的代码中的某处创建一个工厂,但我发现了这个问题。
  • 请注意,这不适用于任何语言,因为现在 Do 不能再接受所有类型的 Input,但这是 Abc 接口所要求的。
  • 这就是我提出问题后不久意识到的:)

标签: go interface


【解决方案1】:

是的,您必须遵循您指定的方法签名。 如果您不遵循签名,则不会称为“执行”。

一个例子:interface example

来自围棋之旅:There is no explicit declaration of intent, no "implements" keyword.


【讨论】:

    【解决方案2】:

    在 Go 中实现接口时,必须使用完全相同的签名。否则你无法实现它。

    【讨论】:

      猜你喜欢
      • 2016-03-15
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-18
      • 2015-07-03
      相关资源
      最近更新 更多