11.2 Объявление классов Objective-Pascal |
Вверх Предыдущий Следующий |
Классы Objective-C или -Pascal объявляются как и классы объектов Pascal, но они используют ключевое слово objcclass: Классы Objective-C Как можно видеть, синтаксис эквивалентен синтаксису Object Pascal, с некоторыми расширениями. Для того, чтобы использовать классы Objective-C, существует внешний модификатор: он указывает компилятору, что класс реализован во внешнем объектном файле или библиотеке, и что определение предназначено для импорта. Ниже приведен пример внешнего определения класса Objective-C: NSView = objcclass external(NSResponder) private _subview : id; public function initWithFrame(rect : NSRect): id; message 'initWithFrame:'; procedure addSubview(aview: NSView); message 'addSubview:'; procedure setAutoresizingMask(mask: NSUInteger); message 'setAutoresizingMask:'; procedure setAutoresizesSubviews(flag: LongBool); message 'setAutoresizesSubviews:'; procedure drawRect(dirtyRect: NSRect); message 'drawRect:'; end; Как можно видеть, определение класса не сильно отличается от определения класса Object Pascal; Присутствует только заметно больше директив сообщений: каждый метод Objective-C или Objective-Pascal должен иметь имя сообщения, связанное с ним. В приведенном выше примере, для определения класса не было указано никакое внешнее имя, а это означает, что идентификатор Pascal используется в качестве имени класса Objective-C. Однако, поскольку Objective-C не столь строг в соглашениях по именованию, псевдоним иногда должен быть указан для имени класса Objective-C, который не подчиняется правилам идентификаторов Pascal. Следующий пример определяет класс Objective-C, который реализован на языке Pascal: MyView = objcclass(NSView) public data : Integer; procedure customMessage(dirtyRect: NSRect); message 'customMessage'; procedure drawRect(dirtyRect: NSRect); override; end; Отсутствие ключевого слова external указывает компилятору, что методы должны быть реализованы позже в исходном файле: он будет рассматриваться так же, как обычный класс объекта Pascal. Обратите внимание на наличие директивы override: в Objective-C все методы являются виртуальными. В Object Pascal, переопределение виртуального метода должно быть сделано через директиву override. Это было распространено на классы Objective-C: что позволяет компилятору проверить правильность определения. Если класс не реализует метод протокола (подробнее об этом в следующем разделе), ожидается message или override: все методы являются виртуальными, и либо запускается новый метод (или повторно введённый), или существующий отменяется. Только в случае метода, который является частью протокола, этот метод может быть определен без message или override. Обратите внимание, что объявление класса Objective-C может указывать на родительский класс, а может и не указывать. В Object Pascal, если у класса нет родителя то класс автоматически будет потомком TObject. В Objective-C, это не так: новый класс будет начинать иерархию классов. Тем не менее, Objective-C имеет класс, который содержит полный набор функций общего корневого класса: NSObject, который можно рассматривать как эквивалент TObject в Object Pascal. Он имеет и другие корневые классы, но в целом, классы Objective-Pascal должны быть потомками от NSObject. Новый корневой класс в любом случае, должен реализовать NSObjectProtocol - так же, как это делает сам класс NSObject. И, наконец, классы Objective-Pascal могут обладать свойствами, но эти свойства могут использоваться только в коде Pascal: компилятор в настоящее время не экспортирует свойства что-бы использовать их в Objective-C. |