Протокол
Протокол объявляет программируемый интерфейс, который любой класс может принять решение реализовать. Протоколы позволяют двум классам, отдаленно связанным наследованием для передачи друг с другом для достижения определенной цели. Они таким образом предлагают альтернативу разделению на подклассы. Любой класс, который может обеспечить поведение, полезное для других классов, может объявить программируемый интерфейс для продажи того поведения анонимно. Любой другой класс может принять решение принять протокол и реализовать один или больше его методов, таким образом использовав поведение. Класс, объявляющий протокол, как ожидают, вызовет методы в протоколе, если они будут реализованы последователем протокола.
Формальные и неофициальные протоколы
Существует два варианта протокола, формального и неофициального:
Формальный протокол объявляет список методов, которые клиентские классы, как ожидают, реализуют. Формальные протоколы имеют свое собственное объявление, принятие и проверяющий тип синтаксис. Можно определять методы, реализация которых требуется или дополнительная с
@required
и@optional
ключевые слова. Подклассы наследовали формальные протоколы, принятые их наследователями. Формальный протокол может также принять другие протоколы.Формальные протоколы являются расширением языка Objective C.
Неофициальный протокол является категорией на
NSObject
, который неявно делает почти всех последователей объектов протокола. (Категория является функцией языка, позволяющей Вам добавить методы к классу, не разделяя ее на подклассы.) Реализация методов в неофициальном протоколе является дополнительной. Прежде, чем вызвать метод, проверки вызывающего объекта, чтобы видеть, реализует ли целевой объект его. Пока дополнительные методы протокола не были внедрены в Objective C 2.0, неофициальные протоколы были важны для способа, которым Основа и классы AppKit реализовали делегацию.
Принятие и приспосабливание формальному протоколу
Класс может или объявить принятие формального протокола или наследовать принятие от суперкласса. Синтаксис принятия использует угловые скобки в @interface
объявление класса. В следующем примере, CAAnimation
класс объявляет, что его суперкласс NSObject
и затем формально принимает три протокола.
@interface CAAnimation : NSObject <NSCopying, CAMediaTiming, CAAction> |
Класс — и любой экземпляр того класса — как говорят, соответствуют формальному протоколу, если класс принимает протокол или наследовался от другого класса, принимающего его. Соответствие к протоколу также означает, что класс реализует все требуемые методы протокола. Во время выполнения можно определить, соответствует ли объект протоколу путем отправки ему a conformsToProtocol:
сообщение.
Создание собственного протокола
Можно также объявить собственный протокол и реализовать код, связывающийся с последователями того протокола. Для описания того, как сделать это, см. документ, окончательно описывающий протоколы.