масти карты. Соответственно метод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 задает некоторые символьные константы, которые мы будем использовать для обозначения мастей и цветов.