Справочник Ada 95
12.5.1 Формальные типы-приватные и производные
Класс, определяемый для формального типа-приватного, может быть ограниченным или неограниченным, помеченным или непомеченным; более конкретный класс для такого типа неизвестен. Класс, определяемый для формального производного типа, — это класс производности, укоренённый в базовом типе.
Синтаксис
formal_private_type_definition ::= [[абстрактный] помеченный] [ограниченный] приватный
formal_derived_type_definition ::= [абстрактный] новый subtype_mark [с приватным]
Правила допустимости
Если у объявления формального типа-параметра есть known_discriminant_part, то оно не должно содержать default_expression для дискриминанта.
Базовый подтип формального производного типа — это подтип, обозначаемый subtype_mark в formal_derived_type_definition. Для объявления формального производного типа служебные слова с приватным должны присутствовать тогда и только тогда, когда базовый тип является помеченным; в этом случае формальный производный тип является приватным расширением базового типа, и базовый тип не должен быть типом класса. Аналогично, служебное слово абстрактный должно присутствовать только если базовый тип является помеченным.
Если формальный подтип определён, то фактический подтип также должен быть определён.
Для формального производного типа-параметра без discriminant_part:
- Если базовый подтип ограничен, фактический подтип должен быть ограничен и статически совместим с базовым;
- Если базовый подтип — неограниченный доступ или составной подтип, фактический подтип должен быть неограниченным.
- Если базовый подтип — неограниченный дискриминированный подтип, то фактический подтип должен иметь то же количество дискриминантов, и каждый дискриминант фактического типа должен соответствовать дискриминанту базового, в смысле 3.7.
Объявление формального производного типа не должно содержать known_discriminant_part. Для формального приватного типа-параметра с known_discriminant_part:
- Фактический тип должен быть типом с тем же количеством дискриминантов.
- Фактический подтип должен быть неограниченным.
- Подтип каждого дискриминанта фактического типа должен статически соответствовать подтипу соответствующего дискриминанта формального типа.
Для формального типа-параметра с unknown_discriminant_part фактический тип может, но не обязан иметь дискриминанты, и может быть определённым или неопределённым.
Статическая семантика
Класс, определяемый для формального типа-приватного, следующий:
Тип Определения Определённый класс
ограниченный приватный класс всех типов
приватный класс всех неограниченных типов
помеченный ограниченный приватный класс всех помеченных типов
помеченный приватный класс всех неограниченных помеченных типов
ограниченный приватный класс всех типов
приватный класс всех неограниченных типов
помеченный ограниченный приватный класс всех помеченных типов
помеченный приватный класс всех неограниченных помеченных типов
Присутствие служебного слова абстрактный определяет, может ли фактический тип быть абстрактным.
Формальный тип-приватный или производный — это соответственно приватный или производный тип. Формальный помеченный производный тип — это приватное расширение. Формальный тип-приватный или производный является абстрактным, если в его объявлении присутствует служебное слово абстрактный.
Если базовый тип — составной тип, который не является типом массива, формальный тип наследует компоненты от базового типа (включая дискриминанты, если не указан новый discriminant_part), как и для производного типа, определённого с помощью derived_type_definition (см. 3.4).
Для формального производного типа предопределённые операторы и унаследованные пользовательские подпрограммы определяются базовым типом и неявно объявляются в самом раннем месте, если таковое имеется, в непосредственной области видимости формального типа, где соответствующая примитивная подпрограмма базового типа видна (см. 7.3.1). В экземпляре копия такого неявного объявления объявляет вид соответствующей примитивной подпрограммы предка формального производного типа, даже если эта примитивная подпрограмма была переопределена для фактического типа. Когда предок формального производного типа сам является формальным типом, копия неявного объявления объявляет вид соответствующей скопированной операции предка. Однако в случае формального приватного расширения тег формального типа — это тег фактического типа, поэтому если тег в вызове статически определяется как тег формального типа, выполняемый код будет соответствовать фактическому типу.
Для prefix S, обозначающего формальный неопределённый подтип, определён следующий атрибут:
- S'Definite
- S'Definite возвращает True, если фактический подтип, соответствующий S, определён; в противном случае возвращает False. Значение этого атрибута — предопределённого типа Boolean.
ПРИМЕЧАНИЯ
9 В соответствии с общим правилом, что фактический тип должен принадлежать классу, определённому для формального (см. 12.5, «Формальные типы»):
- Если формальный тип неограниченный, то фактический тип также должен быть неограниченным;
- Для формального производного типа фактический тип должен принадлежать классу, укоренённому в базовом подтипе.
10 Фактический тип может быть абстрактным только в том случае, если формальный тип абстрактный (см. 3.9.3).
11 Если у формального типа есть discriminant_part, фактический тип может быть как определённым, так и неопределённым. В противном случае фактический тип должен быть определённым.