Описание реализации объектов |
Описание реализации объекта устанавливает видимые (общедоступные) свойства объекта. В том числе конструкторы и деструкторы, доступные свойства и методы, реализованные объектные интерфейсы и т.д.
Как правило, это описание представляет собой отдельный исходный файл. Для того чтобы использовать сервисы такого vip-интерфейса, необходимо с помощью директивы #include в использующий код включить файлы с описанием реализации объекта и файлы с описанием используемых объектных интерфейсов.
Использование описания реализации позволяет раздельно компилировать использующий код и реализующие vip-интерфейсы.
Описание реализации объекта должно располагаться вне всех vip-интерфейсов или форм (на уровне файла проекта). Каждое описание реализации объекта вводит новый тип. Имя такого типа совпадает с именем реализующего vip-интерфейса.
Реализация в одном vip-интерфейсе как предка, так и потомка, запрещена. При указании в списке имплементации "родственных" obj-интерфейсов в порядке от родителя к потомку происходит замещение родительских интерфейсов потомками. При нарушении указанного порядка описания выдаётся сообщение об ошибке.
Описание реализации состоит из оператора vipInterface и, возможно, ряда других операторов, объединенных в секции public и static. Если секции public и static отсутствуют, оператор end; можно опустить.
<описание-реализации-объектного-интерфейса> = <оператор-vipInterface> deprecated [<deprecated-message>]; [ <public-секция> ] [ <static-секция> ] end;
<оператор-vipInterface> позволяет указать наследование реализации и дать перечень объектных интерфейсов, реализуемых данным интерфейсом. Обратите внимание, что <оператор-vipInterface> оформляется как законченный оператор (с точкой с запятой в конце).
<оператор-vipInterface> = [private | public] [web] vipInterface <имя-vip-интерфейса> [ ( <имя-родительского-vip-интерфейса> ) ] [ implements <список-obj-интерфейсов> ] [ <мета-тэг> = "<значение>" {, <мета-тэг> = "<значение>" } ] [ licensed ( <имя-модуля> {, <имя-модуля> } ) ];
Ключевое слово private определяет реализацию объектного интерфейса, видимую только в том компоненте, в котором она была описана. При компиляции других компонентов она будет недоступена. Ключевое слово введено начиная с Атлантис 5.1.23.
Ключевое слово public определяет реализацию объектного интерфейса, которая будет доступна к использованию при компиляции других компонентов. Ключевое слово public является необязательным. Это сделано с целью совместимости с существующим исходным кодом. Ключевое слово введено начиная с Атлантис 5.1.23.
Ключевое слово web определяет vip-интерфейс, который реализует web-сервис. Для таких vip-интерфейсов будет сгенерирован код для публикации через Internet Information Service. Подробнее см. раздел "Web-сервисы. ". Ключевое слово web введено начиная с Атлантис 5.1.36.
<имя-vip-интерфейса> - имя реального vip-интерфейса, который реализует функции указанных объектных интерфейсов. Это означает, что такое имя должно появиться в конструкции "interface <имя>", причем для данного проекта ровно один раз.
<имя-родительского-vip-интерфейса> - см. "Наследование vip-интерфейсов. ".
Ключевое слово implements задает перечень объектных интерфейсов функции которых реализует указанный vip-интерфейс:
<список-obj-интерфейсов> = <obj-интерфейс> [ (virtual) ] {, <obj-интерфейс> [ (virtual) ] }
<obj-интерфейс> - идентификатор объектного интерфейса, реализуемого указанным vip-интерфейсом.
Ключевое слово virtual указывает на необходимость сохранения родительской реализации. См. также примеры в разделе "Наследование реализации. ".
<мета-тэг> - содержит дополнительную информацию, не регламентированную синтаксисом языка . В т.ч.:
sourceFile = "<имя-файла>"
sourceFile - файл, в котором содержится реализация интерфейса. Если мета-тэг sourceFile не указан, то считается что реализация интерфейса расположена в одноименном с интерфейсом файле. См. также "Синтаксис наследования vip-интерфейса. ".
Ключевое слово deprecated позволяет пометить реализацию объектного интерфейса как устаревшую (не рекомендуемую для использования). При попытке использовать такой интерфейс будет выдаваться предупреждение на этапе компиляции исходного текста программы. Ключевое слово deprecated введено начиная с Атлантис 5.4.17.
<deprecated-message> - текст сообщения, выводимого компилятором при попытке использовать данный интерфейс. Если не задан, выдается стандартное предупреждение. Доступно начиная с Атлантис 5.4.17.
<public-секция> - содержит описание новых и перекрытых методов и других элементов. Перечисленные в секции элементы получают статус "общедоступный" (public).
<public-секция> = public: <новый-или-перекрытый-элемент> { <новый-или-перекрытый-элемент> }
<static-секция> содержит описание новых и перекрытых методов и других элементов. Перечисленные в секции элементы получают статусы "общедоступный" (public) и "статический" (static).
<static-секция> = static: <новый-или-перекрытый-элемент> { <новый-или-перекрытый-элемент> }
<новый-или-перекрытый-элемент> = constructor <имя-конструктора> [(<список-параметров>)] ; | destructor <имя-деструктора> ; ] | property <имя-свойства> : <тип-свойства> [read] [write] [<тип-соединения>]; | index <имя-индекса> = <имя-свойства> [ (<список-атрибутов>) ] {, <имя-свойства> [ (<список-атрибутов>) ] } ; | datastream <имя-потока-данных> ; | function <имя-функции> [ (<список-параметров>) ] : <тип-возврата> ; | procedure <имя-процедуры> [ (<список-параметров>) ] ;
Описание конструкции constructor см. "Конструкторы и деструкторы. ".
Описание конструкции destructor см. "Конструкторы и деструкторы. ".
Описание конструкции property см. "Свойства. ".
Описание конструкции index см. "Объектные индексы. ".
Описание конструкции datastream см. "Поток данных. ".
Описание конструкции function см. "Методы. ".
Описание конструкции procedure см. "Методы. ".
Пример 1.
vipInterface MyPublicVip implements Obj2, ObjExample;
Пример 2.
public vipInterface ETest2 implements ITest2, ITest3;
Пример 3.
objInterface parent; ... end; objInterface child (parent); ... end; objInterface sample; ... end; vipInterface vipSample implements parent, sample, child;
В приведённом примере obj-интерфейс child замещает parent. Или, говоря по-другому, vip-интерфейс vipSample реализует parent посредством child.
Приведённое выше описание vipSample эквивалентно следующему описанию:
vipInterface vipSample implements child, sample;
Порядок описания реализуемых obj-интерфейсов существенен, т.к. в откомпилированном коде сохраняются индексы obj-интерфейсов, а не имена.
Пример 4.
// Описываем интерфейс, содержащий статический метод vipInterface IGetName; public: static function GetName : string; end; ... // Вызываем статический метод str := vGetName::GetName;
Пример 5.
// Описываем интерфейс, содержащий статические методы vipInterface IGetName; static: function GetName : string; function GetAge : integer; end; ... // Вызываем статические методы str := vGetName::GetName; age := vGetName::GetAge;
Пример 6.
// -- dstream.vih -- vipInterface SampleInterface; public: datastream SampleStream; end;
Ключевое слово deprecated введено начиная с Атлантис 5.4.17.
Ключевое слово web введено начиная с Атлантис 5.1.36.
Ключевое слово datastream введено начиная с Атлантис 5.1.2x.
Ключевые слова private и public введены начиная с Атлантис 5.1.23.
Атлантис 5.0.