Как в Go обходятся без наследования — что такое встраивание (embedding)?
- Есть ли в Go наследование?
- Композиция вместо наследования в Go
Наследования нет. Встраивание — поле без имени: методы и поля встроенного типа продвигаются во внешний и вызываются напрямую. Это композиция, а не наследование: нет переопределения с полиморфизмом — встроенный тип не знает о внешнем.
- Внешний тип может объявить метод с тем же именем — он перекроет продвинутый
- Встроенный тип вызывает свои методы, а не «переопределённые» внешним
- Полиморфизм в Go — через интерфейсы
А ещё Встраивание интерфейса в структуру — частичная реализация, остальные методы паникуют на nil
Подробно
Продвижение. Поля и методы встроенного типа доступны как свои: s.Log(), s.prefix. Методы встроенного типа входят в набор методов внешнего, поэтому Service удовлетворяет интерфейсам, которым удовлетворяет Logger.
Почему это не наследование. Если Logger.Log вызывает l.format(), а Service объявил свой format, вызовется Logger.format — никакой виртуальной диспетчеризации. Нет и преобразования Service к Logger: это разные типы.
Встраивание интерфейсов в интерфейсы — сборка контрактов: type ReadWriter interface { Reader; Writer }.
Когда осторожно: встраивание расширяет публичный API внешнего типа всеми методами встроенного; встроенный sync.Mutex делает Lock доступным снаружи — обычно лучше именованное поле mu sync.Mutex.
Пример
type Logger struct{ prefix string }
func (l Logger) Log(msg string) { fmt.Println(l.prefix, msg) }
type Service struct {
Logger // встраивание
db *sql.DB
}
s := Service{Logger: Logger{prefix: "[svc]"}}
s.Log("старт") // продвинутый методЧто хотят услышать
- Продвижение полей и методов.
- Отличие от наследования.
- Полиморфизм через интерфейсы.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Встраивание — полноценное наследование с полиморфизмом и виртуальными методами
- ✓Композиция с продвижением методов во внешний тип
- ✗Внешний тип не может объявить метод с тем же именем
- ✗Встроенный тип вызывает переопределённые методы внешнего
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.