Считаются ли встроенные поля по отношению к интерфейсам - PullRequest
0 голосов
/ 11 января 2019

В Golang я могу иметь встроенные поля внутри struct. Встроенное поле «продвигается», а новый struct получает возможность использовать все функции встроенных полей, как если бы он был частью себя. Итак, мой вопрос: учитываются ли функции встроенных полей в реализации интерфейса? Например:

type Foo struct {
    Name string
}

func (f *Foo) Name() {
    fmt.Println(f.Name)
}

type Hello interface {
    Name()
    Hello()
}

type Bar struct {
    World string
    *Foo
}

func (b *Bar) Hello() {
    fmt.Println("Hello")
}

В приведенном выше коде Bar{} не реализует функцию с именем Name(), а Foo{}. Поскольку Foo{} является встроенным полем внутри Bar{}, имеет ли Bar{} a Hello тип?

1 Ответ

0 голосов
/ 13 января 2019

Вот как это отследить в спецификации языка

Узнайте, что означает реализация интерфейса, в разделе « Типы интерфейса »:

Типы интерфейсов 101

Тип интерфейса определяет набор методов, называемый его интерфейсом. переменная типа интерфейса может хранить значение любого типа с методом набор, который является любым надмножеством интерфейса . Такой тип называется реализовать интерфейс.

Или из раздела " Наборы методов "

Набор методов типа определяет интерфейсы, которые реализует тип ...

Итак, важен набор методов того типа, который вы хотите реализовать в интерфейсе. Давайте посмотрим, что составляет метод, установленный в случае встроенных полей:

Первое, что я проверил, был раздел " Наборы методов ", но он отправляет нас в другое место:

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

Итак, мы переходим в раздел " Типы структур " и находим:

Поле или метод f встроенного поля в структуре x называется повышен, если x.f является легальным селектором, который обозначает это поле или метод е.

...

Учитывая тип структуры S и определенный тип T, продвигаемые методы включается в набор методов структуры следующим образом :

  • Если S содержит встроенное поле T, наборы методов S и * S оба включают повышенные методы с получателем T. Набор методов * S также включает повышенные методы с получателем * T.
  • Если S содержит встроенное поле * T, наборы методов S и * S оба включают повышенные методы с приемником T или * T.

Итак, учитывая, что методы встроенного поля повышены , они включены в набор метода содержащей структуры. Как мы видели выше, набор методов любого типа определяет, реализует ли он интерфейс.

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