0Pricing
Go Academy · Урок

Продвижение методов

Наследуйте методы через встраивание

«Продвижение методов» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Встраивание структур
  2. Встраивание интерфейсов
  3. Продвижение методов
  4. Композиция вместо наследования
← Назад к Go Academy