11.3 Формальное объявление

Вверх  Предыдущий  Следующий

Object Pascal имеет концепцию forward объявлений. Objective-C развивает эту концепцию немного дальше: он позволяет объявить класс, который определен в другом модуле. Это названо в Objective-Pascal 'Формальным объявлением'. Из синтаксической диаграммы, допустимо следующее объявление:

MyExternalClass = objcclass external;

Это формальное объявление. Оно говорит, что компилируемый класс MyExternalClass является классом Objective-C, но таким образом не объявлены члены класса. Тип может быть использован в остальной части модуля, но его использование ограничено распределением памяти (в определении поля или параметра метода) и назначением (подобно указателю).

Как только встречается определение класса, компилятор обеспечит совместимость типов.

Следующий модуль использует формальное объявление:

unit ContainerClass;

{$mode objfpc}

{$modeswitch objectivec1}

 

interface

 

type

  MyItemClass = objcclass external;

 

  MyContainerClass = objcclass

    private

      item: MyItemClass;

    public

      function getItem: MyItemClass; message 'getItem';

  end;

 

implementation

 

function MyContainerClass.getItem: MyItemClass;

begin

  result:=item; // Присвоение возможно.

end;

 

end.

Второй модуль может содержать объявление фактического класса:

unit ItemClass;

 

{$mode objfpc}

{$modeswitch objectivec1}

 

interface

 

type

  MyItemClass = objcclass(NSObject)

    private

      content : longint;

    public

      function initWithContent(c: longint): MyItemClass;

          message 'initWithContent:';

      function getContent: longint;

          message 'getContent';

end;

 

implementation

 

function MyItemClass.initWithContent(c: longint): MyItemClass;

begin

  content:=c;

  result:=self;

end;

 

function MyItemClass.getContent: longint;

begin

  result:=content;

end;

 

end.

Если оба модуля используются в программе, компилятор знает, что это за класс и может проверить правильность некоторых присвоений:

Program test;

 

{$mode objfpc}

{$modeswitch objectivec1}

 

uses

  ItemClass, ContainerClass;

 

var

  c: MyContainerClass;

  l: longint;

begin

  c:=MyContainerClass.alloc.init;

  l:=c.getItem.getContent;

end.