Объектно-ориентированное программирование

масти карты. Соответственно методcolor (цвет карты) тоже будет возвращать символ в качестве результата. Следующий код описывает этот метод:

color
» вернуть цвет данной карты « [ #red ]
(suit = #diamond) ifTrue:
(suit = #club) ifTrue: [ #black ]
(suit = #spade) ifTrue: [ #black ]
(suit = #heart) ifTrue: [ #red ]

Обратите внимание, что условные операторы в языкеSmalltalk записываются так, как если бы они были сообщениями, пересылаемыми условной части(на самом деле так оно и есть). Квадратные скобки образуют то, что вSmalltalk называетсяblocks, их можно рассматривать как конструкцию, аналогичную блокам в языкеPascal (пара командbegin, end). (В действительности все сложнее. Фактически блок сам по себе является объектом, который пересылается в качестве аргумента вместе с сообщениемifTrue к булевскому объекту. НачинающимSmalltalk-программистамлучше проигнорировать подробности.)

3.5.3. Классы и методы в языке Objective-C

Язык программирования Objective-C — это объектно-ориентированноерасширение директивного языкаC. В качестве такового он наследует большую часть структур и методов использованияC. В частности, реализация модулей основана на стандартном соглашении языкаC о разделении файлов на две категории: интерфейсные файлы(обычно с расширением».h») и файлы реализации(в языкеC они обычно имеют расширение».c», а вObjective-C —».m»). Предполагается, что пользователю класса(первая категория людей, перечисляемая в дихотомии Парнаса) требуется просмотреть только интерфейсные файлы.

Интерфейсный файл, подобный тому, что используется для нашей абстракции игральных карт(листинг3.4), служит двум целям. Для программиста он является удобным средством документирования назначения и функционирования класса. Для системы он передает информацию о типах данных и требованиях к оперативной памяти. Иногда эти два применения оказываются в конфликте друг с другом. Например, в языкеObjective-C, как и в языкеSmalltalk,

Листинг 3.4. Интерфейсный файл класса Card на языкеObjective-C

/*

описание интерфейса класса Card язык программирования: Objective-Cавтор: Тимоти Бадд, 1995 */

# import <objc/Object.h>

/* определить символьные константы для мастей */

# define Heart 0
# define Club 1
# define Diamond 2
# define Spade 3

/* определить символьные константы для цветов */

# define Red 0
# define Black 1
/* интерфейс класса Card */
@ interface Card : Object
{ suit;
int
int rank;

 

int faceup;
}
/* методы класса Card */
— (void) suit: (int) s rank: (int) c;
— (int) color;
— (int) rank;
— (int) suit;
— (void) flip;
— (void) drawAt: (int) and: (int);
@ end

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

Несколько первых строк интерфейсного файла содержат код, общий для языковC иObjective-C. Директиваimport аналогична директивеinclude из языкаC, за исключением того, что она гарантирует, что файл подключается только один раз. В данном случае импортируемый файл— это описание интерфейса классаObject. Директиваdefine задает некоторые символьные константы, которые мы будем использовать для обозначения мастей и цветов.