Областью определения перечисляемого типа данных является множество имен. Размер данного множества имен определяется в зависимости от типа перечисляемого типа данных. Различают следующие перечисляемые типы данных:
- наращиваемый перечисляемый тип данных;
- перечисляемый тип данных, расширяющий наращиваемый перечисляемый тип данных, другими словами, основанный на наращиваемом перечисляемом типе данных;
- перечисляемый тип данных, который не является ни наращиваемым, ни расширяющим.
Имена, объявляемые посредством ключевого слова ENUMERATION, могут быть только допустимыми значениями перечисляемого типа данных. Каждое имя из данной области определения называется элементом перечисления и обозначается enumeration_id.
Областью определения перечисляемого типа данных, который не является ни наращиваемым, ни расширяющим, задаваемой при его объявлении, является упорядоченное множество элементов перечисления, указанных при его объявлении.
Областью определения наращиваемого перечисляемого типа данных является множество элементов перечисления, указанных при его объявлении, плюс объединение множеств элементов перечислений, заключающее в себе области определения всех расширяющих перечисляемых типов данных. Наращиваемый перечисляемый тип данных является обобщением основанных на нем перечисляемых типов данных. Наращиваемый перечисляемый тип данных задается посредством ключевого слова EXTENSIBLE.
Областью определения расширяющего перечисляемого типа данных является множество элементов перечисления, указанных при его объявлении, плюс элементы перечисления, указанные непосредственно (а не через расширение) в наращиваемом перечисляемом типе данных, на котором он основан. Расширяющий перечисляемый тип данных задается посредством ключевого слова BASED_ON.
Перечисляемый тип данных может быть как наращиваемым, так и расширяющим перечисляемым типом данных. Наращиваемый перечисляемый тип данных может быть задан без элементов перечисления, а также основан на другом наращиваемом перечисляемом типе данных без задания элементов перечисления, расширяющих данное базисное перечисление. Взаимосвязь "основан на" является транзитивной, то есть расширяющее перечисление остается основанным на наращиваемом перечислении самого верхнего уровня даже при наличии нескольких уровней взаимосвязей "основан на"; расширяющее перечисление включает все элементы, как промежуточных наращиваемых перечислений, так и наращиваемого перечисления самого верхнего уровня.
Примечания
1 Наращиваемое перечисление, расширенное два или более раза в одном контексте, может иметь большую область определения, чем его расширения, и в этом случае оно действительно является обобщением.
2 В первой редакции настоящего стандарта упорядочение элементов перечисления определяло упорядочение значений. В настоящем стандарте не определено никакого упорядочения, за исключением указанного ниже в правиле по перечислению d). Это сделано, чтобы обеспечить существование наращиваемых перечисляемых типов данных, в которых упорядочение расширений не может быть определено.
Синтаксис: |
Правила и ограничения:
a) Перечисляемый тип данных должен использоваться только в качестве базисного типа данных для определенного типа данных.
b) Перечисляемый тип данных может быть расширен, только если в его определении указано ключевое слово EXTENSIBLE.
c) Элемент type_ref в enumeration_extension должен быть ссылкой на наращиваемый перечисляемый тип.
d) В целях сравнения, упорядочение значений перечисляемого типа данных, который не является ни наращиваемым, ни расширяющим, может быть определено их относительной позицией в списке enumeration_id; первый встретившийся элемент должен быть меньше второго, второй - меньше третьего и т.д.
e) Не существует упорядочения значений для наращиваемого перечисления или расширяющего перечисления.
f) Для перечисления, не являющегося ни наращиваемым, ни расширяющим, в качестве его области определения должны быть заданы элементы перечисления.
g) Для перечисления, не являющегося наращиваемым, но являющегося расширяющим, должны быть заданы элементы перечисления, расширяющие область определения наращиваемого перечисления, на котором оно основано.
h) Два разных перечисляемых типа данных могут содержать одинаковый элемент enumeration_id в своих множествах имен. Если перечисляемые типы данных не являются расширениями одного наращиваемого типа данных, то их элементы enumeration_id относятся к разным понятиям, даже если их локальные имена совпадают. В данном случае, любая ссылка на элемент enumeration_id (например, в выражении) должна быть уточнена посредством идентификатора типа данных, чтобы обеспечить однозначность ссылок. Ссылка при этом выглядит следующим образом: type_id.enumeration_id.
Примечание - Элемент type_id, используемый для уточнения элемента enumeration_id, всегда определяется как перечисляемый тип данных.
Пример - В данном примере перечисляемые типы данных использованы для демонстрации того, как могут двигаться различные виды транспортных средств.
TYPE car_can_move = ENUMERATION OF | ||||
(left, right, backward, forward); | ||||
END_TYPE; | ||||
TYPE plane_can_move= ENUMERATION OF | ||||
(left, right, backward, forward, up, down); | ||||
END_TYPE; |