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

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

В самом общем случае категория, определяемая для формального приватного типа, — это все типы, но категория может быть ограничена только нелимитированными типами или только помеченными типами. Аналогично, категория для формального неполного типа — это все типы, но категория может быть ограничена только помеченными типами; в отличие от других формальных типов, фактический тип не обязательно должен быть заморожен (см. 13.14). Определяемая категория для формального производного типа — это класс производных, укоренённый в типе-предка.

Синтаксис

formal_private_type_definition ::= [[abstract] tagged] [limited] private
formal_derived_type_definition ::=
[abstract] [limited | synchronized] new subtype_mark [[and interface_list]with private]

Правила законности

Если в объявлении формального типа-параметра есть known_discriminant_part, то оно не должно содержать default_expression для дискриминантов.
Тип-предок формального производного типа — это тип-подтип, обозначаемый subtype_mark в formal_derived_type_definition. Для формального объявления производного типа ключевые слова with private должны присутствовать тогда и только тогда, когда тип-предок — помеченный тип; в этом случае формальный производный тип является приватным расширением типа-предка, и тип-предок не должен быть типом-класса. Аналогично, список интерфейсов interface_list или необязательные ключевые слова abstract или synchronized должны присутствовать только если тип-предок — помеченный тип. Ключевые слова limited или synchronized должны присутствовать только если тип-предок и все родительские типы являются ограниченными типами. Ключевое слово synchronized должно использоваться (вместо limited), если тип-предок или любой из родительских типов — синхронизированные интерфейсы. Тип-предок должен быть ограниченным интерфейсом, если используется ключевое слово synchronized.
Фактический тип формального производного типа должен быть потомком типа-предка и каждого родительского типа формального типа. Если формальный тип нелимитирован, фактический тип также должен быть нелимитирован. Фактический тип для формального производного типа должен быть помечен тогда и только тогда, когда формальный производный тип является частным расширением. Если ключевое слово synchronized присутствует в объявлении формального производного типа, фактический тип должен быть синхронизированным помеченным типом.
Если формальный приватный или производный подтип определён, то фактический подтип также должен быть определён.
formal_incomplete_type_declaration объявляет формальный неполный тип. Единственный вид формального неполного типа — это неполный вид. Таким образом, формальный неполный тип подпадает под те же ограничения использования, что и любой другой неполный тип — см. 3.10.1.
Для формального производного типа-параметра без discriminant_part:
  • Если подтип-предок ограничен, фактический подтип должен быть ограничен и статически совместим с предком;
  • Если подтип-предок является неограниченным типом доступа или составным подтипом, фактический подтип должен быть неограниченным;
  • Если подтип-предок является неограниченным дискриминированным подтипом, то фактический подтип должен иметь то же количество дискриминантов, и каждый дискриминант фактического подтипа должен соответствовать дискриминанту предка, в смысле 3.7;
  • Если подтип-предок является подтипом доступа, фактический подтип должен исключать null тогда и только тогда, когда подтип-предок исключает null.
Объявление формального производного типа не должно иметь known_discriminant_part. Для формального приватного или неполного типа-параметра с known_discriminant_part:
  • Фактический тип должен иметь то же количество дискриминантов.
  • Фактический подтип должен быть неограниченным.
  • Подтип каждого дискриминанта фактического типа должен статически соответствовать подтипу соответствующего дискриминанта формального типа.
Для формального типа-параметра с unknown_discriminant_part фактический тип может, но не обязан иметь дискриминанты, и может быть определённым или неопределённым.
При проверке правил законности, для определения в теле шаблона, является ли тип неограниченным в любом частичном представлении, дискриминированный подтип считается имеющим ограниченное частичное представление, если он является потомком неопределённого формального приватного или производного типа.

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

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

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

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

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


Spec-Zone.ru

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