Синтаксис наследования vip-интерфейса Назад В начало Вперед

Наследование vip-интерфейсов описывается аналогично наследованию obj-интерфейсов, допускается только одиночное наследование:

vipInterface <имя-vip-интерфейса>
  ( <имя-родительского-интерфейса> )
  ...

Подробнее см. "Описание реализации объектов. ".

В описание vip-интерфейса можно включить описания функций. Эти функции будут играть роль виртуальных методов классических объектов. Фактически, будет создан obj-интерфейс с именем o$<имя vip-интерфейса>, в котором будут присутствовать эти описанные функции.

Если при наследовании obj-интерфейсов имплементирующий vip-интерфейс был обязан реализовать все функции, имеющие место в имплементируемом obj-интерфейсе, то в случае наследования vip-интерфейсов, программист имеет возможность как расширить функциональность (добавить методы), так и изменить уже существующую функциональность (переопределить методы).

Все методы и свойства, указанные при описании vip-интерфейса должны быть в обязательном порядке имплементированы. Так же необходимо реализовать все функции в имплементированных, а не унаследованных obj-интерфейсах. Когда есть желание перекрыть реализацию унаследованной функции, в описании интерфейса нужно описать перекрываемую функцию.

При компиляции интерфейса-потомка реализация интерфейса-родителя должна уже быть скомпилирована. Это связано с тем, что потомок наследует и такие сложные структурные элементы как окна и логическую таблицу, которые живут только в реализации.

Для того, чтобы не зависеть от порядка компиляции, реализован механизм стековой компиляции. Это позволит при компиляции интерфейса-потомка перейти, если это необходимо, к компиляции интерфейса-родителя.

Файл, в котором содержится реализация интерфейса, указывается в мета-тэге sourceFile (см. также пример 2):

sourceFile = "<имя-файла>"

Если мета-тэг sourceFile не указан, то считается что реализация интерфейса расположена в одноименном с интерфейсом файле.

В мета-тэге sourceFile указывается имя, а пути для поиска файлов указываются в параметре Compilers.SourcesPath.

Примеры

Пример 1

//=============================================================
vipInterface interface1
		implements obj1, obj2;
public:
		function F1( w : word ) : integer;
		procedure P1( s : string );
end;

//=============================================================
vipInterface interface2( interface1 )
		implements obj3;
public:
		function F1( w : word ) : integer;
		function F2( i : integer ) : word;
		procedure obj2.M1 (t : integer);
end;

В примере интерфейс interface2 перекрывает реализацию функции F1 и процедуры M1 obj-интерфейса obj2, добавляет собственную реализацию для функции F2 и obj-интерфейса obj3, реализация процедуры P1, obj-интерфейса obj1 и остальных методов obj-интерфейса obj2 наследуется.

В приведенном примере для интерфейса-потомка interface2 сформируется obj-интерфейс o$interface2, являющийся потомком obj-интерфейса o$interface1.

Рис. 1 Иерархия объектов из примера 1

Пример 2

В данном примере при компиляции интерфейса VipInterface03 автоматически выполнится компиляция VipInterface02, который будет искаться в файле VipInterface02.vip. В свою очередь, при компиляции интерфейса VipInterface02 автоматически выполнится компиляция VipInterface01, который будет искаться в файле VipInterface01b.vip.

//=========================================================
vipInterface VipInterface01 sourceFile="VipInterface01b.vip";
public:
  procedure Proc1;
  procedure Proc01;
end;

//=========================================================
vipInterface VipInterface02(VipInterface01);
public:
  procedure Proc1;
  procedure Proc02;
end;

//=========================================================
vipInterface VipInterface03(VipInterface02);
public:
  procedure Proc1;
end;

Версия

Атлантис 5.0.

Раздел static описания vip-интерфейсов введен начиная с Атлантис 5.1.25.