Чтение онлайн

на главную - закладки

Жанры

Программирование на Objective-C 2.0
Шрифт:

Общий формат @interface имяКласса (имяКатегории) <протокол,...> объявлениеМетода объявлениеМетода @end

Здесь объявляется категория имяКатегории для класса имяКласса с перечислен-ными методами. Если указаны один или несколько протоколов, категория под-чиняется перечисленным протоколам.

Компилятору должно быть известно имяКласса из предшествующего объяв-ления в секции @interface для этого класса. Можно объявить любое число кате-горий влюбом числе различных исходных файлов. Перечисленные методы ста-новятся частью данного класса и наследуются подклассами.

Категории

уникально определяются парами ямяКласса/имяКатегории. Например, в определенной программе может быть только одна категория NSArray (Private). Но можно использовать одинаковые имена категорий. Например, определенная программа может содержать категорию NSArray (Private) и категорию NSString (Private), и это будут различные категории.

Вы не обязаны реализовать методы категории, которые не собираетесь ис-пользовать.

Категория может только расширять определение класса дополнительными методами или переопределять существующие методы этого класса. Она не мо-жет определять какие-либо новые переменные экземпляра для этого класса.

Если в нескольких категориях объявлен методе одним и тем же именем для одного класса, то нельзя определить, какой метод будет выполняться при вы-зове. Например, в следующем примере для класса Complex определяется катего-рия с именем ComplexOps, содержащая четыре метода экземпляра. #import «Complex.h» @interface Complex (ComplexOps) -(Complex *) abs; -(Complex *) exp; -(Complex *) log; -(Complex *) sqrt; @end

Можно предположить, что где-либо будет присутствовать секция implementation, в которой реализуются один ли несколько из этих методов. #import "ComplexOps.h" @implementation Complex (ComplexOps) -(Complex *) abs { } -(Complex *) exp { } -(Complex *) log { } -(Complex *} sqrt { } @end

Категория, содержащая методы, которые будут реализоваться другими подклассами, называется неформальным (informal) протоколом или абстрактной (abstract) категорией. В отличие от формальных протоколов, компилятор не выполняет никаких проверок на подчинение неформальному протоколу. На этапе выполнения объект может проверяться на подчиненность неформальному протоколу в зависимости от конкретного метода. Определение протокола

Общий формат @protocol имяПроюкола <протокол, ...> обьявленияМетодов @optional обьявленияМетодов @required обьявленияМетодов @end

Здесь определяется протокол имяПроюкола с указанными методами. Если включены другие протоколы, то протокол имяПротокола принимает (adopt) перечисленные протоколы.

Это определение называют также определением формального протокола. Класс подчиняется (conform) протоколу имяПротокола, если в нем определяются или наследуются все обязательные (required) методы, объявленные в этом протоколе, а также все методы любых других перечисленных протоколов. Компилятор проверяет подчиненность и выводит предупреждение, если класс не подчиняется объявленному формальному протоколу. На этапе выполнения объекты могут проверяться или Tie проверяться на подчиненность формальному протоколу.

Перед списком методов, реализация которых не обязательна, может ставиться директива @optional. В дальнейшем можно использовать директиву @required, чтобы обновить

список обязательных методов, которые должны быть реализованы для подчинения протоколу.

Протоколы часто не привязываются к какому-либо определенному классу, но применяются как способ определения общего интерфейса, используемого несколькими классами. Специальные модификаторы типов

Для типов параметров и возвращаемого значения методов, объявляемых в про-токолах, могут использоваться спецификаторы типов, которые приводятся в таблице В.8. Эти спецификаторы используются для распределенных объектных приложений.

Табл. В.8. Специальные модификаторы типов в протоколах Спецификатор Описание in Аргумент относится к объекту, значение которого будет изменено отправителем и передано (т.е. скопировано) назад получателю. out Аргумент относится к объекту, значение которого будет изменено получателем и передано назад отправителю. inout Аргумент относится к объекту, значение которого будет изменяться как отправителем, так и получателем, и будет передаваться между ними; это спецификатор по умолчанию. oneway Используется для объявлений типа возвращаемого значения; обычно используется (one way void), чтобы указать, что объект, вызвавший этот метод, не обязан ожидать получения возвращаемого значения, то есть метод может выполняться асинхронно. bycopy Аргумент или возвращаемое значение должно копироваться. byref Аргумент или возвращаемое значение передается по ссылке и не копируется. Объявление объекта

Общий формат имяКласса *var1, *var2, ...;

Здесь определяются переменные varl, var2,... как объекты из класса тяКласса. Отметим, что это объявление переменных-указателей, при котором не выделяется пространство для конкретных данных, содержащихся в каждом объекте. В объявлении Fraction *myFract;

определяется myFract как объект класса Fraction или, точнее, как указатель на этот объект. Чтобы фактически выделить пространство для структуры данных класса Fraction, нужно вызвать обычно alloc или новый метод для этого класса, например, myFract = [Fraction alloc];

В результате для объекта типа Fraction будет выделен достаточный обьем па-мяти и возвращен указатель на этот объект, который будет присвоен переменной myFract. Переменную myFract часто называют объектом или экземпляром класса Fraction. Если метод alloc определен в корневом объекте, всем переменным эк-земпляра нового выделяемого объекта присваивается значение 0. Но это не оз-начает, что объект инициализирован должным образом; прежде чем использовать этот объект, для него должен быть вызван какой-либо метод инициализации (например, init).

Поскольку переменная myFract была объявлена явным образом как объект из класса Fraction, она называется переменной со статическим контролем типа. Компилятор может проверять применение переменных со статическим контролем типа на согласованность с определением класса с точки зрения правильности использования методов, а также типов их аргументов и возвращаемых значений. Объявление объекта с типом id

Общий формат id <протокол,...> varl, var2, ...;

Поделиться:
Популярные книги

Вперед в прошлое 9

Ратманов Денис
9. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 9

Идеальный мир для Лекаря 16

Сапфир Олег
16. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 16

Точка Бифуркации IX

Смит Дейлор
9. ТБ
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Точка Бифуркации IX

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая

Личный аптекарь императора. Том 2

Карелин Сергей Витальевич
2. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Личный аптекарь императора. Том 2

Назад в СССР 5

Дамиров Рафаэль
5. Курсант
Фантастика:
попаданцы
альтернативная история
6.64
рейтинг книги
Назад в СССР 5

Дитя прибоя

Трофимов Ерофей
Дитя прибоя
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Дитя прибоя

Я все еще князь. Книга XXI

Дрейк Сириус
21. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще князь. Книга XXI

Черный Маг Императора 9

Герда Александр
9. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 9

Последний Паладин. Том 9

Саваровский Роман
9. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 9

Гримуар темного лорда VI

Грехов Тимофей
6. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VI

Наследник с Меткой Охотника

Тарс Элиан
1. Десять Принцев Российской Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник с Меткой Охотника

Идеальный мир для Лекаря 20

Сапфир Олег
20. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 20

Бастард

Осадчук Алексей Витальевич
1. Последняя жизнь
Фантастика:
фэнтези
героическая фантастика
попаданцы
5.86
рейтинг книги
Бастард