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:


Тип категории

1103


Для определенных внешне категорий допустима  возможность псевдонима: 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 (если класс специально не переопределяет его).