Реализация объектных интерфейсов |
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.