Как получить доступ к методам типа, которые не определены в интерфейсе?

У меня есть интерфейс, который требует, чтобы его разработчик имел метод Click. Однако тип FakeTicker, реализующий этот интерфейс, также реализует метод Tick в дополнение к методу Click.

package main



type Ticker interface{  
  Click() string 
}

type FakeTicker struct{ 
   val string }

func (f FakeTicker) Click() string {    
   return f.val 
}

func (f FakeTicker) Tick() int {    return 1 }

func main() {   
  var clocker Ticker    
  clocker = FakeTicker{"Val"}   
  clocker.Tick()    
}

Здесь я получаю следующую ошибку "clocker.Tick undefined (тип Ticker не имеет поля или метод Tick)"

Я понимаю, что в интерфейсе есть только метод Click(), но поскольку FakeWriter реализует интерфейс, разве он не может вызывать свой собственный метод Tick()?

2 ответа

Решение

Я понимаю, что в интерфейсе есть только метод Click(), но поскольку FakeWriter реализует интерфейс, разве он не может вызывать свой собственный метод Tick()?

Так как ваш clocker переменная определяется как Ticker интерфейс, у вас есть только методы, определенные на этом интерфейсе. Если вы хотите получить доступ к Tick метод, вам придется перейти на FakeTicker тип.

В этом случае вы можете использовать утверждение типа.

func main() {   
    var clocker Ticker    
    clocker = FakeTicker{"Val"}
    clocker.Click()
    fake := clocker.(FakeTicker)
    fake.Tick()    
}

Вы должны заметить, что утверждение типа вызовет панику, когда утверждение потерпит неудачу, если вы не используете версию с двумя возвращаемыми типами (fake, ok := clocker.(FakeTicker)).

Вам нужно будет преобразовать интерфейс {} в FakeTicker

package main

type Ticker interface {
    Click() string
}

type FakeTicker struct {
    val string
}

func (f FakeTicker) Click() string {
    return f.val
}

func (f FakeTicker) Tick() int { return 1 }

func main() {
    var clocker Ticker
    clocker = FakeTicker{"Val"}
    fakeTicker := clocker.(FakeTicker)
    fakeTicker.Tick()
}
Другие вопросы по тегам