Ограничения на экземпляры, налагаемые спецификацией интерфейса
При построении интерфейсов со сложными графами подтипов/супертипов, допустимые сложные объектные типы данных вычисляют посредством расширения правил, определенных в разделе 11 и приложении В. Граф подтипов/супертипов, определенный в одной или нескольких других схемах, может быть усечен для использования в данной схеме посредством указания только тех объектов, которые необходимы в данной схеме.
В настоящем приложении установлены правила, необходимые для интерпретации графов подтипов/супертипов в которых с одним или несколькими объектными типами данных, изначально имеющимися в графе, не установлены интерфейсы. Такие пропущенные объектные типы данных объектов оставляют пустые места в выражениях супертипов. В данном приложении такие пустые места обозначены как <>. Для удаления пустых мест из выражения супертипа используются следующие преобразования:
ONEOF (А, <>, ...) ONEOF(A, ...);
ONEOF (<>) <> ;
ONEOF (A) А;
A AND <> ONEOF(A,A);
A ANDOR <> A;
TOTAL_OVER (A, <>, ...) TOTAL_OVER(A, ...);
TOTAL_OVER (<>) <> .
Интерпретация оператора AND должна обеспечить, чтобы те объектные типы данных, которые в исходной схеме должны объединяться, не могли бы существовать в данной схеме (обеспечивается оператором ONEOF(A,A)), если с объектными типами данных, с которыми они должны объединяться, не установлены интерфейсы.
Результирующее множество допустимых сложных объектных типов данных для схемы, у которой установлены интерфейсы с другими схемами, вычисляют по следующему алгоритму:
a) создается полный пул объектов для данной схемы. Полный пул включает в себя следующие объекты:
1) все объекты, определенных в данной схеме,
2) все объекты, импортированных в данную схему посредством операторов USE и REFERENCE,
3) все объекты, неявно импортированные в данную схему.
Примечание - Полный пул объектов может содержать несколько объектов с одинаковым именем (в случае их неявного импортирования из разных схем) или может включать в себя один и тот же объект под разными именами (в случае использования оператора USE FROM . . . AS). В первом случае пул будет содержать все объекты с одинаковыми именами, а во втором - только один объект, несмотря на наличие у него нескольких имен;
b) для каждого супертипа из пула объектов сокращается выражение супертипа, посредством удаления всех ссылок на объекты, отсутствующие в пуле объектов. Данное преобразование выполняется многократно, чтобы удалить образовавшиеся пустые места и получить истинное выражение супертипа, в котором присутствуют ссылки только на объекты из пула объектов;
c) вычисляется результирующее множество в соответствии с алгоритмом, установленным в приложении В, начиная с шага по перечислению b) и с применением преобразований, определенных в начале данного приложения, к ограничениям, полученным в результате выполнения шагов по перечислениям b), с) и h) алгоритма из приложения В, раздел В.3.
Сложный объектный тип данных из результирующего множества, содержащий, по крайней мере, один локально объявленный или импортированный посредством оператора USE объект, может быть реализован автономно. Сложный объектный тип данных, не содержащий таких объектов, не может быть реализован автономно в данной схеме.
Примечание - Если существует импортированный в явном виде объект, не присутствующий в каком-либо сложном объектном типе данных из результирующего множества, то такой объект вообще не может быть реализован. Вероятно, данный объект был импортирован по ошибке.
Примеры
1 Для демонстрации данного алгоритма используется схема example (см. пример 1 из приложения В, раздел В.3).
SCHEMA test;
USE FROM example (l);
REFERENCE FROM example (m, c);
END_SCHEMA;
Возможные сложные объектные типы данных определяются следующим образом:
Пул объектов состоит из I, m, с, а, р: I, m и с импортированы в явной форме, а и р импортированы в неявной форме, поскольку они входят в цепочку супертипов объекта I.
Сокращая выражение супертипа для р и преобразовывая его в соответствии с шагом по перечислению b), получаем:
ONEOF(m, f) | AND ONEOF (с, а) | |||
ONEOF(m, <>) | AND ONEOF (с, а) | |||
ONEOF (m) | AND ONEOF (с ,а) | |||
m | AND ONEOF (c ,a) |
Аналогично получаем для а:
ONEOF (l, i)
ONEOF (I, <>)
ONEOF (I)
I