11.2 Объявление классов Objective-Pascal

На верх  Назад  Вперёд

Классы Objective-C или -Pascal объявляются как и классы объектов Pascal, но они используют ключевое слово objcclass:


Классы Objective-C

1101


Как можно видеть, синтаксис эквивалентен синтаксису 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.