Шрифт:
Вернемся к списку таблицы 3.1 и перепишем ее с помощью этого синтаксиса. Но прежде чем сделать это, потребуется получить ваш новый (new) автомобиль (yourCar). Для этого нужно обратиться на завод, например, в такой форме: yourCar = [Car new]; получение нового автомобиля
Вы отправляете сообщение классу Саг (получателю сообщения), запрашивая у него получение нового автомобиля. Результирующий объект (представляющий ваш уникальный автомобиль) сохраняется в переменной yourCar. С этого момента yourCar можно использовать для ссылки на ваш экземпляр автомобиля.
Поскольку вы обращаетесь на завод для получения автомобиля, метод new называется методом завода или методом класса. Остальные действия для вашего нового автомобиля будут методами экземпляра, поскольку они применяются именно к вашему автомобилю. Ниже приводятся примеры выражений с со-общениями, которые можно написать для вашего автомобиля. [yourCar prep]; подготовка для первого использования [yourCar drive]; вождение вашего автомобиля [yourCar wash]; мытье вашего автомобиля [yourCar getGas]; заправка бензином вашего автомобиля, если это требуется [yourCar service]; обслуживание вашего автомобиля [yourCar topDown]; если он с откидным верхом [yourCar topllp]; currentMileage = [suesCar currentOdometer];
В последнем примере используется метод экземпляра, который возвращает определенную информацию: текущий километраж (в милях), показанный одо-метром. Эта информация сохраняется в переменной currentMileage.
Ваша сестра Сью (Sue) может использовать те же методы для своего экземп-ляра автомобиля: [suesCar drive]; [suesCar wash]; [suesCar getGas];
Применение одних и тех же методов к разным объектам является одной из ключевых концепций объектно-ориентированного программирования.
Работа с автомобилями вряд ли потребуется в ваших программах. Вашими объектами будут компьютерно-ориентированные элементы, такие как окна, пря-моугольники, фрагменты текста, калькулятор или список воспроизведения. Ваши методы будут выглядеть так же, как методы, используемые для автомобилей: [myWindow erase]; Очистка окна [myRect getArea]; Расчет площади прямоугольника [userText spellCheck]; Проверка правописания в определенном тексте [deskCalculator clearEntry]; Стирание последней записи [favoritePlaylist showSongs]; Показ песен в списке воспроизведения избранного [phoneNumber dial]; Набор номера телефона 3.3. Класс Objective-C для работы с дробями
Теперь мы можем определить какой-либо конкретный класс в Objective-C и научиться работать с экземплярами этого класса.
Как всегда, начнем с изучения процедуры. Предположим, что вам нужно написать программу для работы с дробями. Вам могут потребоваться операции сложения, вычитания, умножения и т.д. Если вы не работали с классами, то можете начать с простой программы, которая приводится ниже. // Simple program to work with fractions (Простая программа для работы с дробями) #import <Foundation/Foundation.h> int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int numerator = 1; int denominator = 3; NSLog (@"The fraction is %i/%i", numerator, denominator); [pool drain]; return 0; }
Вывод программы 3.1 The fraction is 1/3 (Дробь равна 1/3)
В программе 3.1 дробь представлена своими числителем (numerator) и зна-менателем (denominator). После создания автоматически высвобождаемого пула (autorelease pool) в двух строках процедуры main объявляются две переменные целого типа — numerator и denominator, которым присваиваются целые значения — соответственно 1 и 3. Это эквивалентно следующим строкам: int numerator, denominator; numerator = 1; denominator = 3;
Мы представили дробь 1/3, сохранив значение 1 в переменной numerator и значение 3 — в переменной denominator. Если нужно сохранить много дробей, то при таком подходе это потребует больших усилий. Каждый раз для ссылки на дробь придется ссылаться на соответствующие числитель и знаменатель. А вы-полнение операций с этими дробями будет очень трудным.
Намного лучше определять дробь (fraction) как один элемент и совместно ссылаться на ее числитель и знаменатель по одному имени, например, myFraction. Начнем с определения нового класса.
В программе 3.2 дублируются функции программы 3.1 с помощью нового класса с именем Fraction. Ниже приводится эта программа с подробным опи-санием ее работы. // Program to work with fractions - class version (Программа для работы с дробями - версия с классом) #import <Foundation/Foundation.h> //---- @interface section ---- (секция (@interface) @interface Fraction: NSObject { int numerator; int denominator; } -(void) print; -(void) setNumerator: (int) n; -(void) setDenominator: (int) d; @end //---- (@implementation section ---- (секция @implementation) @implementation Fraction -(void) print { NSLog (@"%i/%i", numerator, denominator); } -(void) setNumerator: (int) n { numerator = n; } -(void) setDenominator: (int) d { denominator = d; } @end //---- program section ---- (секция program) int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Fraction *myFraction; // Create an instance of a Fraction (Создание экземпляра Fraction) myFraction = [Fraction alloc]; myFraction = [myFraction init]; // Set fraction to 1/3 (Присваивание дроби значения 1/3) [myFraction setNumerator: 1]; [myFraction setDenominator: 3]; // Display the fraction using the print method (Вывод дроби с помощью метода print) NSLog (@"The value of myFraction is:"); [myFraction print]; [myFraction release]; [pool drain]; return 0; }
Вывод программы 3.2 The value of myFraction is: (Значение myFraction) 1/3
Как можно видеть из комментариев, программа 3.2 логически разделена на три секции:
@interface
@implementation
program
В секции @interface описывается класс, компоненты его данных и его мето-ды, в секции @implementation содержится конкретный код, который реализует эти методы, секция program содержит программный код для выполнения цели прог-раммы.
Каждая из этих секций является частью любой программы на Objective-C, но вам не всегда придется писать каждую секцию самостоятельно. Каждая секция обычно помещается в свой собственный файл. Пока мы держим их в одном файле. 3.4. Секция @interface
Определяя новый класс, вы должны сделать несколько вещей. Во-первых, вы должны сообщить компилятору Objective-C, откуда поступил этот класс, то есть указать имя его родительского (parent) класса. Во-вторых, вы должны указать, какой тип данных должен сохраняться в объектах этого класса, то есть описать данные, которые будут содержать члены этого класса. Эти члены называются переменными экземпляров (instance variable). И, наконец, нужно определить тип операций, или методов (method), которые можно использовать при работе с объектами из этого класса. Все это делается в специальной секции программы, которая называется секцией интерфейса (@interface). В общем виде эта секция имеет следующий формат: @interface Имя-Нового-Класса: Имя-Родительского-Класса { объявления-членов; } объявления-методов; @end