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

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

Жанры

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

Применение метода к объекту может влиять на состояние (state) этого объекта. Если метод определяется как «заправить мой автомобиль бензином», то после выполнения этого метода будет заполнен бензобак вашего автомобиля. Таким образом, метод повлияет на состояние бака автомобиля.

Объекты являются уникальными представителями класса, и каждый объект содержит некоторую информацию (данные), которые обычно являются частными для этого объекта. Методы — это средства доступа и изменения этих данных.

Язык программирования Objective-C имеет следующий синтаксис для при-менения методов к классам и экземплярам: [ Класс-или-Экземпляр метод ];

В этом синтаксисе после левой прямоугольной скобки следует имя класса или экземпляра этого класса, а затем (после

одного или нескольких пробелов) — ме-тод, который нужно выполнить. В конце ставится правая прямоугольная скобка и завершающая точка с запятой. Если вы обращаетесь к классу или экземпляру для выполнения некоторого действия, можно сказать, что вы отправляете ему сообщение (message); это сообщение принимает получатель (receiver). По-этому показанный выше формат можно описать следующим образом: [ получатель сообщение ] ;

Вернемся к списку таблицы 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

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

Джон Картер

Берроуз Эдгар Райс
Фантастика:
героическая фантастика
8.18
рейтинг книги
Джон Картер

Бета-тестеры - цикл рассказов Призрака

Призрак
Фантастика:
юмористическая фантастика
8.82
рейтинг книги
Бета-тестеры - цикл рассказов Призрака

"Княгиня Ольга". Компиляция. Книги 1-19

Дворецкая Елизавета Алексеевна
Княгиня Ольга
Приключения:
исторические приключения
5.00
рейтинг книги
Княгиня Ольга. Компиляция. Книги 1-19

Дитя прибоя

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

Неизвестный фактор (Романы)

Нортон Андрэ
Фантастика:
фэнтези
5.00
рейтинг книги
Неизвестный фактор (Романы)

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Северные амуры

Хамматов Яныбай Хамматович
Проза:
историческая проза
5.00
рейтинг книги
Северные амуры

Твердь небесная

Рябинин Юрий Валерьевич
Приключения:
исторические приключения
6.00
рейтинг книги
Твердь небесная

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание

Три Рождества, которые мы провели вдали от дома

Джексон Руби
Проза:
современная проза
5.00
рейтинг книги
Три Рождества, которые мы провели вдали от дома

Кухня народов СССР

Фельдман Исай Абрамович
Дом и Семья:
кулинария
7.00
рейтинг книги
Кухня народов СССР

"Фантастика 2023-121". Компиляция. Книги 1-25

Башибузук Александр
Фантастика 2023. Компиляция
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Фантастика 2023-121. Компиляция. Книги 1-25

На все лишь час

Олина Екатерина
3. Секунда меняет жизнь
Фантастика:
фэнтези
городское фэнтези
мистика
8.08
рейтинг книги
На все лишь час

Я снова граф. Книга XI

Дрейк Сириус
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я снова граф. Книга XI