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

EXTENSION

Extension
• Добавление функционала к классу, структуре, перечислению (как своих типов, так и любых системных)

• Дефолтная реализация протоколов

• Часто используется, когда нет доступа к изменению исходных кодов (системные классы, библиотеки)

• Не может заменять функционал, а только дополнять («monkey-patch» не поддерживается)

• Можно добавлять:
• computed property (stored property нельзя)
• Методы
• init (только convenience), нельзя deinit
• Subscript
• Nested Type
• …

• В Java такого механизма нет (точнее нет простого решения, можно использовать механизм Reflection либо AOP)
Extension
• Имеет доступ к свойствам самого объекта, для которого выполняется расширение

• Напоминает урезанную версию наследования

• Не является самостоятельным объектом, нет имени

• Обязательно «привязан» к какому либо объекту, который расширяет


Когда использовать
• Заплатка, добавление небольшого функционала

• Не увлекаться – можно запутаться

• Если есть доступ к исходному коду – лучше изменить его напрямую, чем создавать много «заплаток»
Наследование
• Extension похож чем-то на наследование – не путайте

• Если нужно добавить большой функционал и выполняется условие «is-a» - лучше создать свой тип и использовать
наследование (неважно, есть доступ к исходному коду или нет, все равно создаем свой новый тип)
Протоколы
• С помощью extensions можно создавать default implementation (дефолтная реализация) для протоколов
• Не нужно создавать базовый класс, чтобы задать реализацию по-умолчанию

• Начиная с Java 8 дефолтная реализация поддерживается сразу внутри интерфейсов (default method)

• Если в классе будет по новому определен метод из extension - будет использоваться метод класса
Домашнее задание
• Прочитать абзац «Adding Protocol Conformance with an Extension»:
• https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

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