Синтаксис объектного интерфейса |
Объектный интерфейс - поименованный набор функций (методов), заданных каждая своим именем и сигнатурой. Для Vip-интерфейсов, не имеющих прототипа, считается, что все его public-функции образуют объектный интерфейс без видимого имени.
Синтаксис объектного интерфейса:
<объектный-интерфейс> = [private | public] [web] objInterface <имя-объектного-интерфейса> [(<имя-родителя>)]; forward; <объектный-интерфейс> = [private | public] [web] objInterface <имя-объектного-интерфейса> [(<имя-родителя>)]; deprecated [<deprecated-message>]; <элемент-интерфейса> [{<элемент-интерфейса>}] end;
Ключевое слово private определяет объектный интерфейс, видимый только в том компоненте, в котором он был определён. При компиляции других компонентов он будет недоступен. Ключевое слово введено начиная с Атлантис 5.1.23.
Ключевое слово public определяет объектный интерфейс, который будет доступен к использованию при компиляции других компонентов. Ключевое слово public является необязательным. Это сделано с целью совместимости с существующим исходным кодом. Ключевое слово введено начиная с Атлантис 5.1.23.
Ключевое слово web определяет объектный интерфейс, который реализует web-сервис. Для таких объектных интерфейсов будет сгенерирован код для публикации через Internet Information Service. Подробнее см. раздел "Web-сервисы. ". Ключевое слово web введено начиная с Атлантис 5.1.36.
<имя-объектного-интерфейса> - имя нового объектного интерфейса (интерфейс-потомок).
<имя-родителя> - имя интерфейса-предка. В интерфейс-потомок автоматически добавятся все методы и свойства интерфейса-предка. Повторное описание этих методов и свойств запрещено.
Ключевое слово forward указывает на опережающее описание objInterface (см. пример 2).
Ключевое слово deprecated позволяет пометить объектный интерфейс как устаревший (не рекомендуемый для использования). При попытке использовать такой интерфейс будет выдаваться предупреждение на этапе компиляции исходного текста программы. Ключевое слово deprecated введено начиная с Атлантис 5.4.17.
<deprecated-message> - текст сообщения, выводимого компилятором при попытке использовать данный интерфейс. Если не задан, выдается стандартное предупреждение. Доступно начиная с Атлантис 5.4.17.
<элемент-интерфейса> - описание методов, свойств и индексов данного объектного интерфейса. То есть, расширение интерфейса-предка.
<элемент-интерфейса> = property <имя-свойства> : <тип-свойства> [read] [write]; | index <имя-индекса> = <имя-свойства> [ (<список-атрибутов>) ] {, <имя-свойства> [ (<список-атрибутов>) ] } ; | datastream <имя-потока-данных> ; | function <имя-функции> [ (<список-параметров>) ] : <тип-возврата> ; | procedure <имя-процедуры> [ (<список-параметров>) ] ;
Описание конструкции property см. "Свойства. ".
Описание конструкции index см. "Объектные индексы. ".
Описание конструкции datastream см. "Поток данных. ".
Описание конструкции function см. "Методы. ".
Описание конструкции procedure см. "Методы. ".
Объявление objInterface должно располагаться вне всех Vip-интерфейсов или форм (на уровне файла проекта). Каждое объявление objInterface вводит новый тип. Имя такого типа совпадает с именем этого объектного интерфейса.
Как правило, объектные интерфейсы описываются в отдельных исходных файлах (каждый в своем). Например, с расширеним .vih. В этом случае директивы #include для такого исходного файла будут подключаться к определениям реализующих Vip-интерфейсов, и к тем исходным текстам, в которых используются ссылки на этот объектный интерфейс.
Использование объектных интерфейсов позволяет полиморфно использовать public-функции, по-разному реализованные в разных Vip-интерфейсах, выбирая одну из конкретных реализаций уже во время выполнения.
Пример 1.
objInterface ObjExample; procedure SimpleProc(i : integer); function SimpleFunc(var s : string) : boolean; end; objInterface Obj2; function F1 (r : ObjExample): integer; function F2 : ObjExample; end;
Пример 2.
objInterface Secon; forward; objInterface Prim; function GetSeconObj : Secon; end; ObjInterface Secon; function GetPrimObj : Prim; end;
Пример 3.
objInterface parent; procedure A; end; objInterface child (parent); // child содержит как procedure A, так и procedure B procedure B; end;
Пример 4.
private ObjInterface ITest2; procedure X2_Test2 (v : QQTbl1); procedure X1_Test2 (v : QQTbl2); end; public ObjInterface ITest3; procedure X3_Test3 (v : QQTbl3); end;
Пример 5.
objInterface objTestLib1; deprecated 'Вместо objTestLib1 использовать objTestLib2'; public: function ff1 : word; function ff2 : word; procedure pp1; procedure pp2; end;
Ключевое слово deprecated введено начиная с Атлантис 5.4.17.
Ключевое слово web введено начиная с Атлантис 5.1.36.
Ключевые слова private и public введены начиная с Атлантис 5.1.23.