Spec-Zone.ru › Ada 2005
Справочник по Ada 2005

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


Spec-Zone.ru

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