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

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

Жанры

Программирование на 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

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

Неправильный лекарь. Том 2

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

Тринадцатый XII

NikL
12. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
7.00
рейтинг книги
Тринадцатый XII

Адепт

Листратов Валерий
4. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Адепт

Кай из рода красных драконов 3

Бэд Кристиан
3. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов 3

Санек 3

Седой Василий
3. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 3

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

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

Черные ножи 3

Шенгальц Игорь Александрович
3. Черные ножи
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черные ножи 3

Леший

Северский Андрей
1. Леший в "Городе гоблинов"
Фантастика:
рпг
5.00
рейтинг книги
Леший

Бастард Императора. Том 9

Орлов Андрей Юрьевич
9. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 9

Надуй щеки! Том 5

Вишневский Сергей Викторович
5. Чеболь за партой
Фантастика:
попаданцы
дорама
7.50
рейтинг книги
Надуй щеки! Том 5

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Газлайтер. Том 20

Володин Григорий Григорьевич
20. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 20

Законы Рода. Том 4

Андрей Мельник
4. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 4

Двойник Короля 5

Скабер Артемий
5. Двойник Короля
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Двойник Короля 5