Реализация объектных интерфейсов Назад В начало Вперед

VIP-интерфейс может предоставлять свои процедуры и функции для вызова из других интерфейсов. Такая возможность реализуется одним из двух способов - либо с помощью объектных интерфейсов, либо с помощью квалификатора public.

VIP-интерфейс может не иметь прототипа. В этом случае те процедуры и функции, которые он предоставляет для вызова другим интерфейсам, помечаются квалификатором public. Для использования такого интерфейса необходимо, чтобы он был заранее скомпилирован и помещен в один из файлов ресурсов, используемых при дальнейшей компиляции. Фактически, для VIP-интерфейса, не имеющего прототипа, неявно создается объектный интерфейс, содержащий все функции, объявленные как public.

В VIP-интерфейсе реализующем объектный интерфейс должны быть реализованы все методы как его собственные, так и родительские.

Неиспользуемые методы описываются как абстрактные:

<абстрактные-методы> = implementation
  <имя-OBJ-интерфейса>.<имя-метода>
  [, <имя-OBJ-интерфейса>.<имя-метода>]
  abstract;

При попытке вызвать абстрактный метод возникает исключение ExAbstractMethodCall.

Ограничение:  свойства не могут быть абстрактными.

Возможен вызов любой функции из реализуемых OBJ-интерфейсов напрямую, даже если этот метод описан позже. При этом неявно подставляется self и приведение к нужному OBJ-интерфейсу. Если указанная функция есть у нескольких OBJ-интерфейсов, возникнет ошибка с требованием явно указать OBJ-интерфейс. Указание OBJ-интерфейса производится явным приведением self к нужному типу. Для вызова локальной функции нужно указать квалификатор private:

...
MyName; 	 // MyName приводится к своему OBJ-интерфейсу
private::MyName;  // вызов private функции
o1(self).GetName; // явное указание OBJ-интерфейса
...

Пример

//=============================================================
objInterface parent;
   procedure A;
end;

//=============================================================
objInterface child (Parent);
   procedure B;
end;

//=============================================================
vipInterface vipChild implements child;

//=============================================================
interface vipChild;
  ...

//-------------------------------------------------------------
procedure A;
// Реализация метода A обязательна
{
 ...
}

//-------------------------------------------------------------
procedure B;
{
 ...
}
  ...
end.

Версия

Атлантис 5.0.