Реализация методов |
Для устранения ограничения на пересечения имён функций (свойств, индексов) различных OBJ-интерфейсов, реализованых в одном VIP-интерфейсе, а также для расширения возможностей реализации функций и свойств OBJ-интерфейсов вводится конструкция с описанием полного имени функции (свойства) при её описании:
function [<имя-OBJ-интерфейса>.]<имя-функции> ( <параметры> ) : <тип>; <реализация>
Аналогично для процедуры:
procedure [<имя-OBJ-интерфейса>.]<имя-процедуры> ( <параметры> ); <реализация>
Для удобства присвоения значения функциям введён идентификатор result, который эквивалентен имени текущей функции.
Конструкция implementation позволяет задать одинаковую реализацию нескольким методам:
implementation <имя-OBJ-интерфейса>.<имя-метода> [ , <имя-OBJ-интерфейса>.<имя-метода> ... ] <реализация>
Возможность одинаковой реализации нескольких методов работает только для методов, имеющих одинаковые прототипы (имена и типы параметров совпадают).
Для того, чтобы можно было создать локальную функцию (свойство) совпадающую по имени с методом одного из реализуемых OBJ-интерфейсов используется квалификатор private (см. пример 3).
Для разграничения доступа к методам и свойствам к квалификаторам public и event добавляются protected и final. По умолчанию считается, что метод (свойство) описано как public. Квалификаторы необходимо указывать только при описании прототипа:
event |
- используется только с методами. Помечает метод как событие. Реализация этого метода определяется использующим интерфейсом; |
public |
- тип доступа по умолчанию. Разрешен доступ к таким методам и свойствам из любого контекста; |
protected |
- разрешен доступ только внутри самого интерфейса; |
final |
- неперекрываемый метод. Можно комбинировать с public и protected. |
В ситуации, когда один Vip-интерфейс реализует более одного объектного интерфейса, имена методов во всех этих объектных интерфейсах должны быть различны (до версии 5.0).
Для того, чтобы из интерфейса-потомка сослаться на реализацию метода в интерфейсе-предке, начиная с Атлантис 5.4.24 используется конструкция:
implementation <потомок> = <предок>
<потомок> - метод интерфейса-потомка:
<потомок> = <метод>
<предок> - метод интерфейса-предка:
<предок> = <метод>
<метод> - имя метода:
<метод> = [<имя-компонента>::]<имя-OBJ-интерфейса>.<имя-метода>
Пример 1.
objInterface objOne; procedure A; end; objInterface objTwo; procedure A; procedure B; end; vipInterface vipSample implements objOne, objTwo; interface vipSample; ... procedure objOne.A; { ... } procedure objTwo.A; { ... } procedure B; { ... } ... end.
Пример 2.
objInterface o1; ... function MyName : string; function GetName : string; property m_Index : integer read; ... end; objInterface o2; ... function GetName : string; property m_Index : integer read write; ... end; ... interface aTest; ... var m_idx : integer; m_idx2 : integer; implementation o1.MyName, o2.GetName function fMyName : string; { fMyName := 'Test'; } function o1.GetName : string; { result := 'GetName'; } implementation o1.m_Index property idx : integer read m_idx; property o2.m_Index : integer read m_idx2 write SetIdx2 (result); ... end.
Пример 3.
... var m_idx : integer; m_idx2 : integer; implementation o1.m_Index property idx : integer read m_idx; private property m_Index : integer read m_idx2 write SetLocalIndex; private function MyName (s : string) : string; { MyName := s + ' private MyName'; }
Начиная с Атлантис 5.4.24 доступна конструкция implementation, позволяющая сослаться на реализацию метода в интерфейсе-предке.