Шрифт:
Одинаковое имя метода может также использоваться в различных классах. Способность объектов различных классов реагировать на методы с одинако-выми именами называется полиморфизмом (polymorphism).
Если метод не возвращает значения, то возвращаемыйТип указы вас гея как void. Если метод возвращает значение типа id, то возвращаемыйТип можно не указывать, хотя практика надежного программирования рекомендует указы вать id к? возвращаемый тип.
Если используется ,... в качестве последнего (или единственного) параметра в списке, то метод принимает переменное число параметров, например, -(void) print: (NSSTRING *) format, ... { }
Ниже приводится пример объявления класса в секции interface: объявляется класс с именем Fraction, родительским классом для которого является NSObject. @interface Fraction: NSObject { int numerator, denominator; ) +(Fraction *) newFract; -(void) setTo: (int) n : (int) d; -(void) setNumerator: (int) n andDenominator: (int) d; -(int) numerator; -(int) denominator; @end
Класс Fraction имеет две целые переменные экземпляра с именами numerator и denominator. Он также содержит один метод класса с именем newFract, который возвращает объект типа Fraction. В него включены также два метода экземпляра с именами setTo:: и setNumerator:andDenominator:. Каждый из них принимает два аргумента и не возвращает никакого значения. В нем содержатся также два метода экземпляра с именами numerator и denominator, которые не принимают никаких аргументов и возвращают значение типа int. Секция implementation Общий формат @implementation имяКласса; определениеМетода определениеМетода ... @end
Определяется класс с именем имяКлаеса. Родительский класс и переменные экземпляра обычно не объявляются повторно в секции implementation (хотя это можно делать), поскольку они уже объявлены ранее в секции interface.
Если реализуются методы ые из какой-либо категории (см. ниже раздел «Оп-ределение категории»), то в секции implementation должны быть определены все методы, объявленные в секции interface. Если в секции interface были указаны один или несколько протоколов, то должны быть определены все методы этих протоколов — неявным образом через наследование или явным образом путем определения в секции implementation.
Каждое определениеМетода содержит код, который будет выполняться при вызове этого метода. Определение метода
Общий формат мТип (возвращаемый Тип) имя1: (тип1) парам 1: имя2(тип2) парам2, ... { обьявленияПеременных программныйОператор программныйОператор return выражение; }
Определяется метод имя1:имя2:.., который возвращает значение типа возвращаемыйТип и имеет формальные параметры парам}, парам2,....; парам} объявляется с типом тип}, парам2с типом тип2, и т.д. Если в качестве мТип указан знак +, это означает, что определяется метод класса, а если знак то определяется метод экземпляра. Это объявление метода должно быть согласовано с соответствующим объявлением метода в секции interface или с определенным ранее определением протокола.
В методе экземпляра можно обращаться к переменным экземпляра данного класса и любым переменным, которые унаследованы этим методом непосред-ственно по имени. Если определяется метод класса, он не может обращаться к каким-либо переменным экземпляра.
Внутри метода можно использовать идентификатор self для ссылки на объект, для которого вызывается метод, то есть на получателя сообщения. Внутри метода можно использовать идентификатор super для ссылки на родительский класс объекта, для которою вызывается метод.
Если возвращаемыйТип не указан как void, то в определении метода должны содержаться один или несколько операторов relume выражениями типа возвра-щаемыйТип. Если возвращаемыйТип указан как void, использовать оператор return не обязательно, и в случае использования он не может содержать возвращаемого значения.
Ниже приводится пример определения метода, где определяется метод setNumerator:andDenominator: в соответствии с его объявлением (см. выше раздел «Объявление метода»), -(void) setNumerator: (int) n andDenominator: (int) d { numerator = n; denominator = d; }
В этом методе двум его переменным экземпляра присваиваются передавае-мые аргументы и не выполняется оператор return (хотя это можно сделать), по-скольку в объявлении метода он не возвращает никакого значения.
В объявлениях для аргументов одномерных массивов не обязательно указывать число элементов этого массива. Для многомерных массивов нужно обязательно указать размер каждой размерности, кроме первой.
Внутри метода можно объявлять локальные переменные, и они обычно объявляются в начале определения метода. Память для автоматических локальных переменных выделяется при вызове метода, и она освобождается при выходе из метода.
Описание оператора return см. ниже в разделе «Оператор return». Синтезируемые методы доступа
Общий формат @synthesize свойство1, свойство2, ...
Здесь указывается, что для перечисленных свойств свойство}, свойство2,... должны быть синтезированы методы доступа.
В списке можно использовать форму записи свойство = instance_var, чтобы ука-зать, что свойство будет связано с переменной экземпляра instanceуаг. Синтези-руемые методы будут иметь характеристики, базирующиеся на атрибутах, объявленных ранее для свойства с помощью директивы @property. Определение категории