Реализация методов Назад В начало Вперед

Для устранения ограничения на пересечения имён функций (свойств, индексов) различных 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, позволяющая сослаться на реализацию метода в интерфейсе-предке.