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

12.5.1 Формальные закрытые и производные типы

В самом общем виде категория, определяемая для формального закрытого типа, — это все типы, но её можно ограничить только нелимитированными типами или только помеченными типами. Категория, определяемая для формального производного типа, — это класс производности, укоренённый в типе предка.

Синтаксис

formal_private_type_definition ::= [[абстрактный] помеченный] [лимитированный] закрытый
formal_derived_type_definition ::=
[абстрактный] [лимитированный | синхронизированный] новый маркер_подтипа [[и список_интерфейсов]с закрытым]

Правила допустимости

Если объявление формального типа в генерике имеет часть_известного_дискриминанта, то оно не должно включать выражение_по_умолчанию для дискриминанта.
Тип предкового подтипа формального производного типа — это подтип, обозначенный маркером подтипа маркер_подтипа в formal_derived_type_definition. Для формального объявления производного типа зарезервированные слова с закрытым должны появляться тогда и только тогда, когда тип предка является помеченным типом; в этом случае формальный производный тип является закрытым расширением типа предка, а предок не должен быть типом класса. Аналогично, список_интерфейсов или необязательные зарезервированные слова абстрактный или синхронизированный должны появляться только если тип предка является помеченным типом. Зарезервированное слово лимитированный или синхронизированный должно появляться только если тип предка и любые родительские типы являются ограниченными типами. Зарезервированное слово синхронизированный должно появляться (вместо лимитированный), если тип предка или любой из родительских типов являются синхронизированными интерфейсами.
Фактический тип для формального производного типа должен быть потомком типа предка и каждого предка формального типа. Если зарезервированное слово синхронизированный появляется в объявлении формального производного типа, фактический тип должен быть синхронизированным помеченным типом.
Если формальный подтип определён, то фактический подтип также должен быть определён.
Для формального производного типа в генерике без части_дискриминанта:
  • Если подтип предка ограничен, то фактический подтип должен быть ограничен и должен быть статически совместим с предком;
  • Если подтип предка является неограниченным типом доступа или составным подтипом, фактический подтип должен быть неограниченным.
  • Если подтип предка является неограниченным дискриминированным подтипом, то фактический подтип должен иметь такое же количество дискриминантов, и каждый дискриминант фактического типа должен соответствовать дискриминанту предка в соответствии с 3.7.
  • Если подтип предка является типом доступа, фактический подтип должен исключать null тогда и только тогда, когда подтип предка исключает null.
Объявление формального производного типа не должно содержать часть_известного_дискриминанта. Для формального закрытого типа в генерике с частью_известного_дискриминанта:
  • Фактический тип должен быть типом с тем же количеством дискриминантов.
  • Фактический подтип должен быть неограниченным.
  • Подтип каждого дискриминанта фактического типа должен статически соответствовать подтипу соответствующего дискриминанта формального типа.
Для формального типа в генерике с частью_неизвестного_дискриминанта, фактический тип может, но не обязан иметь дискриминанты, и может быть определённым или неопределённым.

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

Категория, определяемая для формального закрытого типа, следующая:
Определение типа Определённая категория

ограниченный закрытый категория всех типов
закрытый категория всех нелимитированных типов
помеченный ограниченный закрытый категория всех помеченных типов
помеченный закрытый категория всех нелимитированных помеченных типов
Наличие зарезервированного слова абстрактный определяет, может ли фактический тип быть абстрактным.
Формальный закрытый или производный тип является закрытым или производным типом соответственно. Формальный помеченный производный тип является закрытым расширением. Формальный закрытый или производный тип является абстрактным, если зарезервированное слово абстрактный появляется в его объявлении.
Если тип предка является составным типом, который не является типом массива, формальный тип наследует компоненты от типа предка (включая дискриминанты, если новая часть_дискриминанта не указана), как и для производного типа, определённого derived_type_definition (см. 3.4 и 7.3.1).
Для формального производного типа предопределённые операторы и унаследованные пользовательские подпрограммы определяются типом предка и любыми родительскими типами и неявно объявляются в самом раннем месте, если таковое имеется, непосредственно в области объявления, в которой объявлен формальный тип, где соответствующая примитивная подпрограмма предка или родителя видима (см. 7.3.1). В экземпляре копия такого неявного объявления объявляет представление соответствующей примитивной подпрограммы предка или родителя формального производного типа, даже если эта примитивная подпрограмма была переопределена для фактического типа. Когда предок или родитель формального производного типа сам является формальным типом, копия неявного объявления объявляет представление соответствующей скопированной операции предка или родителя. Однако в случае формального закрытого расширения метка формального типа соответствует метке фактического типа, поэтому если метка в вызове статически определяется как метка формального типа, выполняемый код будет соответствовать фактическому типу.
Для префикса S, обозначающего формальный неопределённый подтип, определён следующий атрибут:
S'Определён
S'Определён возвращает True, если фактический подтип, соответствующий S, определён; в противном случае возвращает False. Значение этого атрибута является предопределённого типа Boolean.

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

В случае, когда формальный тип помечен с неизвестными дискриминантами, а фактический тип является типом класса T'Класс:
  • Для целей определения примитивных операций формального типа каждая из примитивных операций фактического типа рассматривается как подпрограмма (с внутренним соглашением вызова — см. 6.3.1), тело которой состоит из вызова диспетчеризации соответствующей операции T, с формальными параметрами как фактическими параметрами. Если это функция, возвращается результат вызова диспетчеризации.
  • Если соответствующая операция T не имеет контролирующих формальных параметров, то контролирующее значение метки определяется контекстом вызова в соответствии с правилами для вызовов с неопределённой меткой (см. 3.9.2 и 5.2). В случае, когда метка была бы статически определена как метка формального типа, вызов вызывает Program_Error. Если такая функция переименована, любой вызов переименования вызывает Program_Error.
ПРИМЕЧАНИЯ
9 В соответствии с общим правилом, что фактический тип должен принадлежать категории, определённой для формального (см. 12.5, «Формальные типы»):
  • Если формальный тип нелимитированный, то таковым же должен быть и фактический;
  • Для формального производного типа фактический тип должен быть в классе, укоренённом в подтипе предка.
10 Фактический тип может быть абстрактным только если формальный тип абстрактный (см. 3.9.3).
11 Если формальный тип имеет часть_дискриминанта, фактический тип может быть определённым или неопределённым. В противном случае фактический тип должен быть определённым.


Spec-Zone.ru

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