Продвижение методов
Наследуйте методы через встраивание
«Продвижение методов» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Наследование методов через встраивание
При встраивании типа его методы также продвигаются. Внешний тип может вызывать их так, будто сам их определяет, — это вариант наследования в Go.
Продвинутый метод
Car встраивает Engine и автоматически получает его метод Start.
package main
import "fmt"
type Engine struct{}
func (Engine) Start() { fmt.Println("engine started") }
type Car struct{ Engine }
func main() {
c := Car{}
c.Start()
}Методы работают со встроенным значением
Продвинутый метод работает со встроенным полем, а не с внешней структурой. Он не видит другие поля внешней структуры.
package main
import "fmt"
type Counter struct{ n int }
func (c *Counter) Inc() { c.n++ }
func (c Counter) Get() int { return c.n }
type Widget struct{ Counter }
func main() {
w := Widget{}
w.Inc()
w.Inc()
fmt.Println(w.Get())
}Переопределение метода
Определите метод с тем же именем во внешней структуре, чтобы переопределить продвинутый метод. Приоритет имеет метод внешней структуры.
package main
import "fmt"
type Animal struct{}
func (Animal) Speak() string { return "..." }
type Dog struct{ Animal }
func (Dog) Speak() string { return "Woof" }
func main() {
fmt.Println(Dog{}.Speak())
}Вызов версии встроенного типа
Даже после переопределения можно обратиться к исходному методу через имя встроенного типа.
package main
import "fmt"
type Animal struct{}
func (Animal) Speak() string { return "generic" }
type Dog struct{ Animal }
func (d Dog) Speak() string { return "Woof + " + d.Animal.Speak() }
func main() {
fmt.Println(Dog{}.Speak())
}Продвижение и интерфейсы
Поскольку продвинутые методы входят в набор методов внешнего типа, внешний тип может соответствовать интерфейсам благодаря методам встроенного типа.
package main
import "fmt"
type Stringer interface{ String() string }
type Base struct{ name string }
func (b Base) String() string { return b.name }
type Wrapper struct{ Base }
func main() {
var s Stringer = Wrapper{Base{"hi"}}
fmt.Println(s.String())
}Наборы методов указателя и значения
Если у встроенного типа есть методы с получателем-указателем, только указатель на внешнюю структуру (или адресуемое значение) получает эти методы в своём наборе методов.
Встраивание для поведения по умолчанию
Встраивайте тип, предоставляющий разумные методы по умолчанию, а затем переопределяйте только те немногие, которые нужно настроить, — это мощный способ повторного использования.
package main
import "fmt"
type DefaultHandler struct{}
func (DefaultHandler) Handle() string { return "default" }
type CustomHandler struct{ DefaultHandler }
func (CustomHandler) Handle() string { return "custom" }
func main() {
fmt.Println(CustomHandler{}.Handle())
}Не настоящая полиморфность
В отличие от классического ООП, встроенный метод не возвращается к переопределению во внешней структуре. В Go нет виртуальной диспетчеризации методов через встраивание.
Продвижение через несколько уровней
Методы продвигаются транзитивно: если A встраивает B, а B встраивает C, A также получает методы C, пока не возникает неоднозначность.
Когда продвижение полезно
- Повторно использовать поведение без переписывания
- Предоставлять значения по умолчанию, которые можно переопределить
- Соответствовать интерфейсам через встроенные методы
Быстрая проверка
Проверьте свои знания о продвижении методов.
Итоги
Вы изучили продвижение методов.
- Встроенные методы продвигаются во внешний тип
- Методы внешнего типа переопределяют продвинутые
- Доступ к исходному методу осуществляется через имя встроенного типа
- Продвижение помогает соответствовать интерфейсам, но виртуальной диспетчеризации нет
Часто задаваемые вопросы
Урок «Продвижение методов» бесплатный?
Да — полный текст урока «Продвижение методов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Продвижение методов»?
Наследуйте методы через встраивание Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Продвижение методов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Встраивание структур
- Встраивание интерфейсов
- Продвижение методов
- Композиция вместо наследования