Spec-Zone.ru › Ada 2022
Руководство по Ada (Ada 2022)

3.4.1 Классы производных типов

Помимо различных языковых классов типов, типы могут быть сгруппированы в классы производных типов.

Статическая семантика

Производный тип производится от своего родительского типа непосредственно; он косвенно производится от любого типа, от которого производится его родительский тип. Производный тип, интерфейсный тип, расширение типа, тип задачи, защищенный тип или формальный производный тип также производятся от каждого предка каждого из его родительских типов, если таковые имеются. Класс производных типов для типа T (также называемый классом, основанным на T) представляет собой набор, состоящий из T (корневого типа класса) и всех типов, производных от T (непосредственно или косвенно), а также любых связанных универсальных или ширококлассовых типов (определенных ниже).
Каждый тип является одним из следующих типов: специфический тип, типом-представителем класса или универсальным типом. Специфический тип определяется объявлением типа, формальным объявлением типа или полным определением типа, встроенным в другой конструкт.
Типы-представители класса

Типы-представители класса определены для (и принадлежат) каждому классу производных типов, укоренённому в типе с меткой (см. 3.9). Для подтипа S типа с меткой T, S'Class является меткой_подтипа соответствующего подтипа типа-представителя класса 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 и universal_access. Они аналогичны типам-представителям класса для этих языковых элементарных классов. Как и в случае типов-представителей класса, если формальный параметр является универсального типа, то фактический параметр любого типа в соответствующем классе допустим. Кроме того, значение универсального типа (включая целочисленный или вещественный числовой_литерал или литерал null) является «универсальным» в том смысле, что оно допустимо там, где ожидается какой-либо конкретный тип в классе (см. 8.6).
Множество значений универсального типа является несвязным объединением наборов значений, возможных для любого определяемого типа в соответствующем классе. Как и типы-представители класса, универсальные типы не имеют собственных примитивных подпрограмм. Однако их «универсальность» позволяет использовать их в качестве операндов с примитивными подпрограммами любого типа в соответствующем классе.
Целочисленный и вещественный числовые классы каждый имеют специфический корневой тип в дополнение к их универсальному типу, названному соответственно root_integer и root_real.
Тип-представитель класса или универсальный тип охватывает все типы в своём классе. Кроме того, universal_integer охватывает тип, имеющий указанный аспект Integer_Literal, а universal_real охватывает тип, имеющий указанный аспект Real_Literal (см. 4.2.1). Специфический тип охватывает только себя.
Специфический тип T2 определяется как потомок типа T1, если T2 совпадает с T1 или если T2 производен (непосредственно или косвенно) от T1. Тип-представитель класса T2'Class определяется как потомок типа T1, если T2 является потомком T1. Аналогично, универсальные числовые типы определяются как потомки корневых типов их классов. Если тип T2 является потомком типа T1, то T1 называется предком T2. Конечный предок типа является предком этого типа, который сам не является потомком любого другого типа. Каждый не помеченный тип имеет уникального конечного предка.
Наследованный компонент (включая наследованный дискриминант) производного типа наследуется от данного предка типа, если соответствующий компонент был унаследован каждым производным типом в цепочке производных, ведущей к данному предку.
ПРИМЕЧАНИЕ Поскольку операнды универсального типа допустимы для предопределённых операторов любого типа в их классе, может возникнуть неоднозначность. Для universal_integer и universal_real эта потенциальная неоднозначность разрешается путём приоритета (см. 8.6) предопределённых операторов соответствующих корневых типов (root_integer и root_real соответственно). Следовательно, в явно неоднозначном выражении, таком как
1 + 4 < 7
где каждый из литералов имеет тип universal_integer, предопределённые операторы root_integer будут иметь приоритет над операторами других специфических целочисленных типов, тем самым разрешая неоднозначность.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API