Как наследование помогает писать меньше кода
Что проверяют
Знаете ли вы, как наследование устроено в Swift, и понимаете ли его цену. Ответ не должен заканчиваться на «общий код уходит в родителя»: интервьюер ждёт сравнения с протоколами и композицией и того, когда что выбрать.
Как отвечать
Механика: подкласс получает свойства и методы родителя, переопределяет нужные через обязательное ключевое слово override и может вызвать исходную реализацию через super. Общий код пишется один раз, подклассы добавляют только отличия.
Особенности Swift, которые стоит назвать:
- только классы: структуры и перечисления не наследуются, для них повторное использование строится на протоколах;
- одиночное наследование: родитель один, протоколов сколько угодно;
final: запрещает наследование и переопределение, заодно позволяет компилятору вызывать методы напрямую, без динамической диспетчеризации;- инициализаторы: у подкласса
UIViewприходится реализоватьrequired init?(coder:), а правила designated и convenience инициализаторов часто становятся следующим вопросом.
В UIKit наследование встроено в сам фреймворк: вы наследуетесь от UIViewController, UITableViewCell, UIView. Собственные глубокие иерархии строят реже. Общее поведение удобнее вынести в протокол с реализацией по умолчанию в расширении, например extension Loadable where Self: UIViewController, или в отдельный объект, который экран получает через инициализатор. В SwiftUI вью это структуры, наследования там нет вовсе, переиспользование идёт через композицию вью и модификаторы.
Где спотыкаются
Рассказывают про Animal и Dog и не приводят ни одного примера из iOS. Для этой позиции пример с ячейками или контроллерами звучит заметно сильнее.
Предлагают BaseViewController как универсальное решение. Через год в нём оказываются аналитика, лоадеры, клавиатура и алерты, и каждый экран тащит всё это, даже если ему нужна одна функция.
Подают «поменял родителя, поменялось у всех» только как плюс. Это же проблема хрупкого базового класса: правка в родителе незаметно ломает подклассы, которые полагались на старую реализацию.