Skip to content

Наследование

Наследование (wiki англ. inheritance) — концепция объектно-ориентированного программирования, согласно которой абстрактный тип данных может наследовать данные и функциональность некоторого существующего типа, способствуя повторному использованию компонентов программного обеспечения.

Как такового наследования в Go нет, но похожего поведения можно добиться через встраивание (embedding).

Рассмотрим на примере. Допустим у нас есть репозиторий UserStorage и ItemStorage с методом GetAll, отвечающий за получение всех записей.

Оба репозитория будут иметь практически одинаковый код, в каждом репозитории  код повторяется. Чтобы предотвратить написание одного и того же шаблонного кода воспользуемся полиморфизмом через интерфейсы, создадим сущность DAO (document access object) с универсальным методом getAll.

Внимание! Код не является рабочим, в нем допущены некоторые упрощения.

Воспользуемся встраиванием и используем метод getAll.

Самое время протестировать код!

Как видим в строке 44 и 63, мы обратились к методу getAll как к собственному методу. Но в этом случае мы могли обойтись и композицией.

Рабочий код ты можешь найти в репозитории по ссылке. Вместо объекта DAO выступает объект SQLAdapter.

При встраивании какого-либо объекта в структуру на самом деле создается еще одно поле по имени типа.

То есть у нас есть доступ к функционалу объекта как из дочернего объекта, так и по обращению к полю объекта. При декларации с помощью литерала структуры нам так же придется указывать поле типа.