Справочное руководство по Ada 2012
3.2.2 Объявления подтипов
Объявление subtype_declaration объявляет подтип некоторого ранее объявленного типа, как определено в subtype_indication.
Синтаксис
Правила разрешения имен
subtype_mark должен разрешиться в обозначение подтипа. Тип, определяемый subtype_mark, является типом подтипа, обозначаемого subtype_mark.
Динамические семантика
Выполнение объявления subtype_declaration состоит из выполнения subtype_indication. Выполнение subtype_indication создаёт новый подтип. Если subtype_indication не включает constraint, новый подтип имеет такой же (возможно, нулевой) ограничитель, как и подтип, обозначенный subtype_mark. Выполнение subtype_indication, включающей constraint, происходит следующим образом:
- Сначала выполняется constraint.
- Затем проверяется, что constraint совместим с подтипом, обозначаемым subtype_mark.
Условие, накладываемое constraint, — это условие, полученное после выполнения constraint. Правила, определяющие совместимость, приведены для каждой формы constraint в соответствующем подпункте. Эти правила таковы, что если constraint совместим с подтипом, то условие, накладываемое constraint, не может противоречить ни одному условию, уже наложенному подтипом на его значения. Если любая проверка совместимости завершится неудачей, возникает исключение Constraint_Error.
ПРИМЕЧАНИЯ
4 scalar_constraint может быть применён к подтипу соответствующего скалярного типа (см. 3.5, 3.5.9 и J.3), даже если подтип уже ограничен. С другой стороны, composite_constraint может быть применён к составному подтипу (или подтипу доступа к составному типу) только в том случае, если составной подтип является неограниченным (см. 3.6.1 и 3.7.1).
Примеры
Примеры объявлений подтипов:
subtype Rainbow is Color range Red .. Blue; -- см. 3.2.1
subtype Red_Blue is Rainbow;
subtype Int is Integer;
subtype Small_Int is Integer range -10 .. 10;
subtype Up_To_K is Column range 1 .. K; -- см. 3.2.1
subtype Square is Matrix(1 .. 10, 1 .. 10); -- см. 3.6
subtype Male is Person(Sex => M); -- см. 3.10.1
subtype Binop_Ref is not null Binop_Ptr; -- см. 3.10
subtype Red_Blue is Rainbow;
subtype Int is Integer;
subtype Small_Int is Integer range -10 .. 10;
subtype Up_To_K is Column range 1 .. K; -- см. 3.2.1
subtype Square is Matrix(1 .. 10, 1 .. 10); -- см. 3.6
subtype Male is Person(Sex => M); -- см. 3.10.1
subtype Binop_Ref is not null Binop_Ptr; -- см. 3.10