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

ЖАНРЫ

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

Следующая строка указывает компилятору Objective-C, что нужно создать по паре методов (установщик и получатель) для каждой из указанных переменных экземпляра (numerator и denominator). @synthesize numerator, denominator;

В общем случае, если у вас есть переменная экземпляра с именем х, то включение следующей строки в секцию implementation указывает компилятору, что нужно синтезировать метод-получатель с именем х и метод-установщик с именем setX:. @synthesize х;

Автоматическое создание методов компилятором имеет смысл, поскольку генерируемые методы доступа эффективны и надежны при работе с несколькими

потоками, на нескольких машинах, с несколькими процессорами.

А теперь вернемся к программе 7.1 и внесем указанные изменения в секции interface и implementation, чтобы методы доступа синтезировалисьы автоматически. Убедитесь, что программа выводит те же результаты. 7.3. Доступ к свойствам с помощью оператора «точка»

Для доступа к свойствам имеется более удобный синтаксис. Чтобы получить значение числителя (numerator), хранящееся в myFraction, можно использовать строку [myFraction numerator]

Сообщение numerator передается объекту myFraction, он возвращает требуемое значение. С помощью оператора «точка» можно написать эквивалентное выражение: my Fraction, numerator

Его общий формат instance.property (экземпляр.свойство)

Этот синтаксис присваивает значения: instance, property = значение

Это эквивалентно выражению [instance setProperty: значение]

В программе 7.1 мы задали numerator (числитель) и denominator (знаменатель) дроби 1/3 с помощью двух строк кода: [myFraction setNumerator: 1]; [myFraction setDenominator: 3];

Ниже приводится эквивалентный способ записи этих строк: myFraction.numerator = 1; myFraction.denominator = 3;

Далее мы будем использовать эти средства для синтеза методов и доступа к свойствам. 7.4. Передача методам нескольких аргументов

Продолжим работу с классом Fraction и внесем некоторые дополнения. Мы определили шесть методов. Было бы хорошо иметь такой метод, чтобы можно было задавать числитель и знаменатель с помощью одного сообщения. Если метод принимает несколько аргументов, после каждого аргумента ставится двоеточие. Аргументы становятся частью имени метода. Например, метод с именем addEntryWithName:andEmail: принимает два аргумента : имя (name) и адрес электронной почты (email). Метод addEntryWithName:andEmail:andPhone: принимает три аргумента: имя, адрес электронной почты и номер телефона (phone).

Метод, с помощью которого задаются numerator (числитель) и denominator (знаменатель), можно было бы назвать setNumerator:andDenominator: и использовать следующим образом: [myFraction setNumerator: 1 andDenominator: 3];

Это вполне подходящий выбор для имени метода, но можно подобрать и более удобное для чтения имя метода, например, setTo:over:. Присвоим myFraction значение 1/3 и сравним это сообщение с предыдущим вариантом: [myFraction setTo: 1 over: 3]; (присвоить 1, деленное на 3)

Я считаю, что оно читается лучше, но окончательный выбор за вами. Выбор имен методов важен для удобочитаемости программы.

А теперь опробуем работу с новым методом. Сначала добавим объявление setTo:over: в файл секции interface, см. программу 7.2. #import <Foundation/Foundation.h> // Определение класса Fraction @interface Fraction : NSObject { int numerator; int denominator; } @property int numerator, denominator; -(void) print; -(void) setTo: (int) n over: (int) d; -(double) convertToNum; @end

Теперь

добавим определение этого метода в файл implementation. #import «Fraction.h» @implementation Fraction @synthesize numerator, denominator; -(void) print { NSLog (@"%i/%i", numerator, denominator); -(double) convertToNum { if (denominator != 0) return (double) numerator / denominator; else return 1.0; -(void) setTo: (int) n over: (int) d f numerator = n; denominator = d; } @end

Новый метод просто присваивает два передаваемых ему целых аргумента (п и d) переменным экземпляра для дроби (numerator и denominator). Ниже приводится тестовая программа для этого метода. #import "Fraction.h" int main (int argc, char *argv[]) { Fraction *aFraction = [[Fraction alloc] init]; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; [aFraction setTo: 100 over: 200]; [aFraction print]; [aFraction setTo: 1 over: 3]; [aFraction print]; [aFraction release]; [pool drain]; return 0; }

Вывод программы 7.2 100/200 1/3 Методы без имен аргументов

При создании имени метода имена аргументов не являются обязательными.

Метод можно объявить следующим образом. -(int) set: (int) n: (int) d;

В отличие от предыдущих примеров, для второго аргумента не задано никакого имени. Этот метод имеет имя set::, и два двоеточия означают, что методу передаются два аргумента, хотя имя одного из них не задано.

При работе с методом set:: в качестве разделителей используется двоеточие: [aFraction set: 1:3];

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

Продолжим работу с классом Fraction. Сначала напишем метод с именем add:, который позволит складывать одну дробь с другой. Ему будет передаваться дробь как аргумент. Ниже приводится объявление этого метода. -(void) add: (Fraction *) f;

Объявление аргумента f: (Fraction *) f

Аргумент для метода add: имеет тип класса Fraction. Звездочка обязательна. Следующее объявление является неверным: (Fraction) f

В качестве аргумента методу add: будет передаваться одна дробь, и метод будет выполнять сложение этой дроби с получателем сообщения; в следующем выражении для дроби bFraction типа Fraction будет выполнено сложение с дробью aFraction типа Fraction. [aFraction add: bFraction];

Напомним, что для сложения дробей а/b и c/d нужно выполнить следующие вычисления. а_ с_= ad + be b d bd

Поместим код для этого метода в секцию @implementation. // сложение дроби (Fraction) с дробью-получателем -(void) add: (Fraction *) f { // Для сложения двух дробей: // a/b + c/d = ((a*d) + (b*c)) / (b * d) numerator = numerator * f.denominator + denominator * f.numerator; denominator = denominator * f.denominator; }

Вы можете ссылаться на объект Fraction, который является получателем сообщения, по его полям numerator и denominator, но не можете непосредственно ссылаться таким же способом на переменные экземпляра аргумента f. Вместо этого вы должны получать их, применяя к f оператор «точка» (или передавая соответствующее сообщение f).

Поделиться с друзьями: