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

Символ @ обозначает начало кода, специфического дляObjective-C. В данном случае код описывает интерфейс классаCard. Разрешается записывать интерфейсы для нескольких классов в одном интерфейсном файле, хотя обычно каждый класс имеет отдельный файл. В языкеObjective-C, так же как и в языкахSmalltalk иDelphi Pascal, каждый класс должен являться подклассом уже существующего класса; классObject является наиболее общим порождающим классом.

Список переменных, заключенный в фигурные скобки, который следует за признаком начала класса, содержит описания переменных(данных) объекта класса. Каждый экземпляр класса имеет отдельную область данных. ЯзыкObjective-C делает различие между традиционными значениями языкаC (целыми, вещественными, структурами и т. д.) и объектами. Объекты объявляются с типом данныхid.

Как и для указателей в языке C, переменная, объявленная с типом данныхid, может содержать либо допустимое значение, либо специальное значениеNull.

Строки, следующие за описанием данных, описывают методы, которые связаны с данным классом. Описание каждого метода начинается с символа»-» (дефис) в первой колонке, за которым может следовать выражение, аналогичное приведению типов данных вC. Оно показывает тип значения, возвращаемого методом. Тип объекта(id) предполагается по умолчанию, если не указано ничего другого. Тем самым методsuit (заметьте, что методы могут иметь те же имена, что и поля данных) возвращает значение типаinteger. Методflip описан как имеющий типvoid. В языкеC это является индикатором того, что возвращаемое значение отсутствует(то есть метод является процедурой, а не функцией). Точнее будет сказать, что возвращаемое значение игнорируется. Как и раньше, табуляция, комментарии и алфавитное упорядочивание делают описание более понятным.

 

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

Файл реализации (листинг3.5) начинается с импорта интерфейсного файла для нашей абстракции игральной карты. Код языкаObjective-C может свободно смешиваться с кодом обычногоC. Например, в листинге3.5 две строчки, определяющие символьные константы для длины и ширины игральной карты, используют синтаксисC.

Директива implementation определяет фактический код для методов, связанных с классом. Как имя родительского класса, так и определения переменных экземпляра в областиimplementation иногда опускают— они могут быть взяты из описания интерфейса.

Листинг 3.5. Файл реализации класса Card на языкеObjective-C

/*

файл реализации для класса Card язык программирования: Objective-C

автор: Тимоти Бадд, 1995
*/
# import «card.h» 68
# define cardWidth
# define cardHeight 75
@ implementation Card
— (int) color
{

return suit % 2;

}

— (int) rank

{

return rank;

}

— (void) suit: (int) s rank: (int) c

{

suit = s; rank = c; faceup = 0;

}

//… кое-чтоопущено

@end

Нет необходимости, чтобы методы в областиimplementation следовали в том же порядке, как они были заданы в интерфейсной части. Чтобы упростить поиск конкретного метода, их часто перечисляют в алфавитном порядке. Заголовки методов повторяют интерфейсный файл, но только теперь за ними следует тело метода. Как и в языкеC, тело функции заключено в фигурные скобки.

3.5.4. Классы и методы в языке C++

Язык C++, подобноObjecive-C, является объектно-ориентированнымрасширением директивного языка программированияC. Как и вC, полезно различать интерфейсные файлы(имеющие расширение».h») и файлы реализации(расширение зависит от системы).