Почему встраивание (embedding) это не наследование?

Middle+
1.3k просмотров
AFK Offer AI

При embedding нет отношения «is-a». Dog не является Animal в системе типов Go — нельзя передать Dog туда, где ожидают Animal.

Методы промоутятся, но ресивер остаётся оригинальным типом — если Animal.Speak() обращается к Animal, он не знает про Dog. Нет виртуальных методов: если Dog определит свой Speak(), Animal.SomeOtherMethod() всё равно вызовет Animal.Speak(), а не Dog.Speak().

Embedding — это делегация (has-a), синтаксический сахар для поля без имени. Полиморфизм достигается через интерфейсы.

Следующий вопрос

Звёздочка у ресивера?