Экземпляр объектного типа данных, объявленный явно или неявно как супертип (см. 9.2.3.2), может также являться экземпляром одного или нескольких из его подтипов (см. H.2).
Синтаксис: | |||
319 | supertype_constraint = | abstract_entity_declaration | | |
abstract_supertype_declaration | supertype_rule . | |||
164 | abstract_entity_declaration = ABSTRACT . | ||
166 | abstract_supertype_declaration = ABSTRACT SUPERTYPE [ subtype_constraint ] . | ||
313 | subtype_constraint = OF ' ( ' supertype_expression ' ) ' . | ||
320 | supertype_expression = supertype_factor { ANDOR supertype_factor } . | ||
321 | supertype_factor = supertype_term { AND supertype_term } . | ||
323 | supertype_term = entity_ref | one_of | ' (' supertype_expression ' ) ' . | ||
263 | one_of = ONEOF ' ( ' supertype_expression { ' , ' supertype_expression } ' ) ' . | ||
322 | supertype_rule = SUPERTYPE subtype_constraint. |
Имеется возможность определить ограничения, в соответствии с которыми могут быть реализованы графы подтипов/супертипов. Данные ограничения могут быть определены в объявлении супертипа посредством условия SUPERTYPE. Они могут также быть определены как отдельные правила посредством объявлений SUBTYPE_CONSTRAINT (см. 9.7).
Примечание - Для того, чтобы существующие схемы, разработанные в соответствии с первой редакцией справочного руководства по языку EXPRESS, оставались допустимыми, объявление ограничений на подтипы/супертипы, в котором при объявлении объекта используются ключевые слова ONEOF, ANDOR или AND, остается допустимым по отношению к настоящему стандарту. Однако, данный способ объявления нежелателен, поскольку в последующих редакциях стандарта планируется его запрет. Рекомендуется использовать объявление SUBTYPE_CONSTRAINT.
Объявление SUBTYPE_CONSTRAINT содержит совокупность ограничений, установленных в выражении supertype_expression. Объявление SUBTYPE_CONSTRAINT может содержать любое число ограничений AND и ONEOF, каждое из которых интерпретируется как отдельное ограничение.
Кроме того, при включении в формулировку какого-либо более сложного ограничения каждое выражение ONEOF, AND и ANDOR интерпретируется как совокупность экземпляров супертипа. При интерпретации выражения supertype_expression применяют следующие правила:
- имя объектного типа данных, встретившееся где-либо в выражении supertype_expression, интерпретируется как множество экземпляров объекта, образующих полную совокупность данного типа данных, как и в глобальном правиле (см. 9.6);
- результат вычисления выражения supertype_expression интерпретируется как множество экземпляров супертипа в соответствии с определенными ниже ограничениями ONEOF, AND и ANDOR.
Несмотря на то, что конечным результатом вычисления выражения supertype_expression для объявления SUBTYPE_CONSTRAINT является множество экземпляров объекта, данное множество не имеет значения. То есть результат всего выражения supertype_expression не устанавливает никакого ограничения, поскольку он не обязательно содержит все экземпляры супертипа и может содержать экземпляры, к которым не применяется ни одно из установленных ограничений.
Примечание - Следовательно, независимые ограничения могут быть связаны оператором ANDOR, который только добавляет экземпляры к общему (не имеющему значения) результату выражения supertype_expression.
Формальный подход к определению возможных комбинаций подтипов/супертипов, которые могут быть реализованы с учетом некоторых возможных ограничений, определенных ниже, представлен в приложении В.
9.2.5.1 Абстрактные супертипы
Язык EXPRESS допускает объявление супертипов, не предназначенных для непосредственной реализации. Для этого объектный тип данных должен содержать ключевые слова ABSTRACT SUPERTYPE в ограничении супертипа. Абстрактный супертип не должен быть реализован, кроме как в сочетании, по крайней мере, с одним из его подтипов.
Примечание - Это означает, что схема, содержащая определение абстрактного супертипа без каких-либо подтипов, является неполной и не может быть реализована, если только подтипы не объявлены в ссылочной схеме.
Пример - В модели перевозок транспортное средство (объект vehicle) может быть представлено абстрактным супертипом, поскольку все экземпляры данного объектного типа данных предназначены быть его подтипами (например, наземное или водное транспортное средство). Объектный тип данных для транспортного средства не должен реализовываться независимо.
ENTITY vehicle | ||||
ABSTRACT SUPERTYPE; | ||||
END ENTITY; | ||||
ENTITY land_based | ||||
SUBTYPE OF (vehicle); | ||||
... | ||||
END ENTITY; | ||||
ENTITY water_based | ||||
SUBTYPE OF (vehicle); | ||||
... | ||||
END ENTITY; |
9.2.5.2 ONEOF
Ограничение ONEOF устанавливает, что совокупности операндов из списка ONEOF являются взаимоисключающими. Никакой экземпляр любой совокупности операндов из списка ONEOF не должен присутствовать в совокупности любого другого операнда из списка ONEOF.
Синтаксис: | ||
263 | one_of = ONEOF ' ( ' supertype_expression { ' , ' supertype_expression } ' ) ' . | |
320 | supertype_expression = supertype_factor { ANDOR supertype_factor } . | |
321 | supertype_factor = supertype_term { AND supertype_term } . | |
323 | supertype_term = entity_ref | one_of | ' ( ' supertype_expression ' ) ' . |
Ограничение ONEOF может комбинироваться с другими ограничениями супертипов, чтобы дать возможность записывать сложные ограничения. Когда ограничение ONEOF присутствует как операнд в другом ограничении, оно представляет множество экземпляров объектов, являющееся объединением совокупностей операндов из списка ONEOF.
Примечание - На естественном языке фраза ONEOF (a, b, с) означает, что "экземпляр объекта должен состоять только из одного из объектных типов данных а, b, с".
Пример - Экземпляр супертипа может быть установлен посредством реализации только одного из его подтипов. Данное ограничение объявляется с использованием ключевого слова ONEOF. Существует множество видов домашних животных (объект pet), но ни одно домашнее животное не может одновременно принадлежать к двум или более видам.