Справочник Ada 95
3.4.1 Классы производных типов
Помимо различных языковых классов типов, типы могут быть сгруппированы в классы производных типов.
Статическая семантика
Производный тип производен от своего родительского типа непосредственно; он производен косвенно от любого типа, от которого производен его родительский тип. Класс производных типов для типа T (также называемый классом, основанным на T) представляет собой множество, состоящее из T (корневого типа класса) и всех типов, производных от T (непосредственно или косвенно), а также любых связанных универсальных или общих типов (определенных ниже).
Каждый тип является либо специфическим типом, общим типом или универсальным типом. Специфический тип определяется с помощью type_declaration, formal_type_declaration или полного определения типа, вложенного в объявление объекта. Общие и универсальные типы определены неявно, чтобы представлять весь класс типов, как показано ниже:
- Общие типы
- Общие типы определены для (и относятся к) каждому классу производных типов, основанному на помеченном типе (см. 3.9). При заданном подтипе S помеченного типа T, S'Class является subtype_mark для соответствующего подтипа помеченного общего типа T'Class. Такие типы называются «общими», потому что, когда формальный параметр определен как общего типа T'Class, допустим фактический параметр любого типа в классе производных, основанном на T (см. 8.6).
- Множество значений для общего типа T'Class представляет собой дизъюнкцию множества значений каждого специфического типа в классе производных, основанном на T (метка служит неявным дискриминантом - см. 3.9). Общие типы не имеют собственных примитивных подпрограмм. Однако, как объяснено в 3.9.2, операнды общего типа T'Class могут использоваться в качестве части вызова диспетчеризации для примитивной подпрограммы типа T. Единственными видимыми компонентами (включая дискриминанты) T'Class являются те, что принадлежат T. Если S является первым подтипом, то S'Class является первым подтипом.
- Универсальные типы
- Универсальные типы определены для (и относятся к) целым, вещественным и дробным классам и обозначаются соответственно как universal_integer, universal_real и universal_fixed. Они аналогичны общим типам для этих языковых числовых классов. Как и в случае с общими типами, если формальный параметр является универсального типа, то фактический параметр любого типа в соответствующем классе допустим. Кроме того, значение универсального типа (включая целое или вещественное numeric_literal) является «универсальным» в том смысле, что оно допустимо там, где ожидается какой-либо конкретный тип в классе (см. 8.6).
- Множество значений универсального типа является объединением множества значений, возможных для любого определимого типа в связанном классе. Как и общие типы, универсальные типы не имеют собственных примитивных подпрограмм. Однако их «универсальность» позволяет использовать их как операнды с примитивными подпрограммами любого типа в соответствующем классе.
Классы целых и вещественных чисел каждый имеют специфический корневой тип помимо своего универсального типа, соответственно названного root_integer и root_real.
Общий или универсальный тип считается охватывающим все типы в своем классе. Специфический тип охватывает только себя.
Специфический тип T2 определен как потомок типа T1, если T2 совпадает с T1 или если T2 производен (непосредственно или косвенно) от T1. Общий тип T2'Class определен как потомок типа T1, если T2 является потомком T1. Аналогично, универсальные типы определены как потомки корневых типов своих классов. Если тип T2 является потомком типа T1, то T1 называется предковым типом T2. Конечный предок типа — это предок типа, который не является потомком никакого другого типа.
Наследуемый компонент (включая наследуемый дискриминант) производного типа наследуется от данного предка типа, если соответствующий компонент был унаследован каждым производным типом в цепочке производных, ведущей к данному предку.
ПРИМЕЧАНИЯ
18 Поскольку операнды универсального типа допустимы для предопределенных операторов любого типа в их классе, может возникнуть неоднозначность. Для universal_integer и universal_real эта потенциальная неоднозначность разрешается путем предоставления преимущества (см. 8.6) предопределенным операторам соответствующих корневых типов (root_integer и root_real соответственно). Таким образом, в явном неоднозначном выражении, таком как
1 + 4 < 7
где каждое из литералов имеет тип universal_integer, будут отданы предпочтения предопределенным операторам root_integer по сравнению с операторами других конкретных целочисленных типов, тем самым разрешая неоднозначность.