Go 接口和实现
在下面的代码段中-Go 接口和实现,go,interface,Go,Interface,在下面的代码段中- 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){
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)作为合法实现?在Go中实现接口时,必须使用完全相同的签名。否则无法实现它。是的,必须遵循指定的方法签名。 如果您不遵循签名,它将不会被称为“执行” 例如: 从围棋之旅:
没有明确的意图声明,没有“implements”关键字。
是的,必须有完全相同的签名。有什么原因让你这样定义它吗?@bereal好的,我试图在我的代码中的某个地方创建一个工厂,在那里我发现了这个问题。请注意,这在任何语言中都不起作用,因为现在Do不能再接受所有类型的输入,但这是Abc接口所要求的。这是我提出问题后不久就意识到的:)