11.6 Категории |
Вверх Предыдущий Следующий |
Подобно хелперам классов в Object Pascal, Objective-C имеет категории. Категории позволяют расширить классы без фактического создания потомков этих классов. Тем не менее, категории Objective-C обеспечивают больше функциональных возможностей, чем хелпер класса: 1.В Object Pascal, только один хелпер класса может находиться в области видимости класса. В Objective-C, в области видимости определенного класса могут находиться несколько категорий. 2.В Object Pascal, метод хелпера не может изменить существующий метод, присутствующий в исходном классе (но он может скрывать метод). В Objective-C, категория может заменять существующие методы в другом классе, а не только добавлять новые. Поскольку в Objective-C все методы являются виртуальными, это также означает, что этот метод будет изменен для всех классах, которые наследуются от класса, в котором был заменен метод (если они не переопределят его). 3.Хелперы Object Pascal не могут быть использованы для добавления интерфейсов к существующим классам. В отличие от этого, категория Objective-C может также реализовывать протоколы. Определение категории очень напоминает определение протокола класса Objective-C, и начинается с ключевого слова objccategory: Тип категории Для определенных внешне категорий допустима возможность псевдонима: Objective-C 2.0 позволяет пустое имя категории. Обратите внимание, что модификатор reintroduce используется, когда заменяется существующий метод, а не тогда когда добавляется новый метод. При замене метода и вызове "inherited" не будет вызываться оригинальный метод класса, но вместо него будет вызвана реализацию метода родительского класса. Ниже приведен пример определения категории: MyProtocol = objcprotocol procedure protocolmethod; message 'protocolmethod'; end;
MyCategory = objccategory(NSObject,MyProtocol) function hash: cuint; reintroduce; procedure protocolmethod; // от MyProtocol. class procedure newmethod; message 'newmethod'; end; Обратите внимание, что это объявление заменяет метод Hash каждого класса , который наследуется от NSObject (если класс специально не переопределяет его). |