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. |