Интерфейс и реализация - PullRequest
2 голосов
/ 31 января 2020

В следующем фрагменте кода -

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) в качестве интерфейса для законной реализации?

Ответы [ 2 ]

5 голосов
/ 31 января 2020

Да, вы должны следовать подписи метода, которую вы указали . Если вы не будете следовать подписи, она не будет называться «внедряющей».

пример: пример интерфейса

из тура Go: There is no explicit declaration of intent, no "implements" keyword.


1 голос
/ 31 января 2020

Обязательно использовать точно такую ​​же сигнатуру при реализации интерфейса в Go. Вы не можете реализовать это иначе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...