Синтаксис наследования 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.