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