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