Вы находитесь на странице: 1из 14

НАСЛЕДОВАНИЕ

Заметки
• Расширение и/или изменение функционала

• Понятия:
• Subсlass
• Superсlass

• Почти все принципы наследования похожи на Java (кроме инициализаторов)


• Нет множественного наследования
• Полиморфизм
• и пр.

• final – запрещает переопределение/расширение (как и в Java)


Компилятор
• При наследовании главная задача компилятора: убедиться что все классы в цепочке инициализируют все свои
свойства

• В Java также по цепочке вызываются все конструкторы, но такое строгой проверки нет, многие свойства могли
оставаться null
Применение override
• Stored property • get/set
• Просто объявить такую же переменную в дочернем • Заменить поведение блоков get/set
классе нельзя (в Java – можно, будет скрытие • Если у родителя есть set - в дочернем классе его
переменной) также обязательно нужно переопределить
• Обязательно переопределять get и set
• Subscript
• Computed property • Заменить функционал
• Можно переопределять только get или get-set
• Если у родителя есть set - в дочернем классе его
• Init
также обязательно нужно переопределить
• Только для designated initializer

• Observers
• Будут вызываться все наблюдатели от родителей до
дочернего
• По сути – не переопределяет, а дополняет

• Методы
• Заменять или добавлять функционал
required init
• required init
• все дочерние классы обязаны переопределить этот init
• У дочернего init необязательно указывать override, т.к. у него будет указан required
init

• Designated initializer должен вызывать родительский designated initializer (как в Java – должна быть
хотя бы одна связь через конструкторы)

• Convenience initializer не вызывает родительские convenience initializer, он может вызывать только


designated initializer или другой convenience initializer из этого же класса
init
Two-phase initialization
1. Сначала инициализация всех своих свойств (затем вызов super, для инициализации родительских свойств)
• До этого момента нельзя использовать и изменять свойства, вызывать другие методы

2. Только после этого можно изменять свойства, вызывать методы (если необходимо) и пр.

• Если коротко описать 2 фазы: сначала происходит инициализация свойств у цепочки классов, затем их использование
(изменение) и весь остальной код
init

Фаза 1 Фаза 2

• Цель – заполнить свойства классов всех • Цель – выполнить кастомный код (если он есть)
классов из цепочки наследования : изменение свойств, вызов методов и пр.

• Сначала каждый subclass убеждается, что все • Выполняется сверху вниз


его свойства заполнены – только потом
вызывает superclass • Изменения самого нижнего класса будут
актуальными (т.к. будет вызываться в конце)
• Выполняется снизу вверх
init
Наследование init
• В Java конструкторы не наследуются (приходится вручную в каждом классе создавать все нужные конструкторы)

• В Swift инициализаторы могут наследоваться в некоторых случаях:


• 1) если в дочернем классе не реализован ни один designated initializer – он наследует все родительские
designated initializer и convenience initializer (в том числе и default initializer – без параметров)

• 2) если дочерний класс переопределяет все родительские designated initializer – дочерний класс автоматически
наследует все convenience initializers из родительского класса

* Компилятор будет вам подсказывать, если не заполните какие-либо свойства или перепутаете порядок инициализации
init
• Не путайте порядок действий:

• designated initializer
• Сначала нужно заполнить свои свойства класса
• Потом вызывать super.init для заполнения свойств родителя

• convenience initializer (наоборот)


• Сначала нужно вызвать self.init
• Потом можно изменять значения свойства (т.к. они были проинициализированы в пред. шаге)
XCode
• Не очень удобные инструменты для генерации init, рефакторинга, переопределений и пр. – особенно после IntelliJ
IDEA и других IDE, к которым привыкли Java разработчики

• Использование сторонних плагинов немного исправляет ситуацию

• С каждой новой версией XСode старается приблизиться к стандартным возможностям IDE


Домашнее задание
• Выполнить Hometask

• Прочитать и выполнить код из этой статьи:


• https://medium.com/@tatsean1977/anatomy-of-initialization-in-swift-3-8778dc45cdf7

• Прочитать:
• https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.ht
ml

• Раздел «Class Inheritance and Initialization»


• https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.ht
ml

Оценить