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

3.10.1 Неполные объявления типов

Нет особых ограничений на указанный тип для типа доступа. В частности, тип компонента указанного типа может быть другим типом доступа или даже тем же типом доступа. Это позволяет взаимозависимые и рекурсивные типы доступа. Объявление incomplete_type_declaration может быть использовано для введения типа, используемого в качестве указанного типа, откладывая его полное определение до последующего full_type_declaration.

Синтаксис

incomplete_type_declaration ::= type defining_identifier [discriminant_part] [is tagged];

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

Объявление incomplete_type_declaration объявляет неполный вид типа и его первого подтипа; первый подтип является неуказанным, если присутствует discriminant_part. Если incomplete_type_declaration включает зарезервированное слово tagged, то он объявляет меченый неполный вид. Неполный вид типа является ограниченным видом типа (см. 7.5).
При заданном типе доступа A, указанный тип T которого является неполным видом, обращение к значению типа A также имеет этот неполный вид, за исключением случаев:
  • если оно происходит в пределах непосредственной области завершения T, или
  • если оно происходит в области nonlimited_with_clause, которая упоминает пакет библиотеки, в видимой части которого объявлено завершение T.
В этих случаях обращение имеет полный вид T.
Аналогично, если subtype_mark обозначает subtype_declaration, определяющий подтип неполного вида T, то subtype_mark обозначает неполный вид, за исключением тех же двух случаев, в которых он обозначает полный вид T.

Правила легальности

Объявление incomplete_type_declaration требует завершения, которое должно быть full_type_declaration. Если incomplete_type_declaration находится непосредственно внутри видимой части package_specification или declarative_part, то full_type_declaration должно находиться позже и непосредственно внутри этой видимой части или declarative_part. Если incomplete_type_declaration находится непосредственно внутри частной части заданного package_specification, то full_type_declaration должно находиться позже и непосредственно внутри либо самой частной части, либо declarative_part соответствующего package_body.
Если incomplete_type_declaration включает зарезервированное слово tagged, то full_type_declaration, которая его завершает, должна объявить меченый тип. Если incomplete_type_declaration имеет known_discriminant_part, то full_type_declaration, которая его завершает, должна иметь полностью соответствующую (явную) known_discriminant_part (см. 6.3.1). Если incomplete_type_declaration не имеет discriminant_part (или unknown_discriminant_part), то соответствующее full_type_declaration всё же может иметь дискриминанты, явно или унаследованные через вывод.
Имя name, обозначающее неполный вид типа, может быть использовано следующим образом:
  • в качестве subtype_mark в subtype_indication access_to_object_definition; единственная форма constraint, разрешенная в этой subtype_indication, — discriminant_constraint;
  • в качестве subtype_mark в subtype_indication объявления subtype_declaration; subtype_indication не должна иметь null_exclusion или constraint;
  • в качестве subtype_mark в access_definition.
Если такое имя обозначает помеченное неполное представление, оно также может использоваться:
  • в качестве метки_подтипа, определяющей подтип параметра в формальной_части;
  • в качестве префикса для ссылка_на_атрибут, у которого обозначение_атрибута равно Class; такая ссылка_на_атрибут ограничена разрешенными здесь использованиями; она обозначает помеченное неполное представление.
Если такое имя встречается в списке объявлений, содержащем завершение неполного представления, оно также может использоваться:
  • в качестве метки_подтипа, определяющей подтип параметра или результата доступа_к_определению_подпрограммы.
Если любое из вышеперечисленных применений встречается как часть объявления примитивной подпрограммы неполного представления, и объявление происходит непосредственно внутри частной части пакета, то завершение неполного представления также должно произойти непосредственно внутри частной части; оно не должно быть отложено до тела пакета.
Другие применения имени, обозначающего неполное представление типа, не допускаются.
Префикс, обозначающий объект, не должен относиться к неполному представлению.

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

Этот абзац был удален.

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

Выполнение объявления_неполного_типа не оказывает влияния.
ПРИМЕЧАНИЯ
83 Внутри части_объявлений объявление_неполного_типа и соответствующее полное_объявление_типа не могут быть разделены вмещающимся телом. Это связано с тем, что тип должен быть полностью определён до того, как он заморожен, а тело замораживает все типы, объявленные перед ним в той же части_объявлений (см. 13.14).

Примеры

Пример рекурсивного типа:
type Ячейка; -- объявление неполного типа
type Ссылка is access Ячейка;
type Ячейка is
record
Значение : Integer;
Последователь : Ссылка;
Предыдущий : Ссылка;
end record;
Голова : Ссылка := new Ячейка'(0, null, null);
Следующий : Ссылка := Голова.Последователь;
Примеры взаимозависимых типов доступа:
тип Person(<>); -- неполное объявление типа
тип Car имеет метку; -- неполное объявление типа
тип Person_Name есть доступ к Person;
тип Car_Name есть доступ ко всем Car'Class;
тип Car имеет метку
запись
Number : Integer;
Owner : Person_Name;
конец записи;
тип Person(Sex : Gender) есть
запись
Name : String(1 .. 20);
Birth : Date;
Age : Integer диапазон 0 .. 130;
Vehicle : Car_Name;
случай Sex есть
когда M => Wife : Person_Name(Sex => F);
когда F => Husband : Person_Name(Sex => M);
конец случая;
конец записи;
My_Car, Your_Car, Next_Car : Car_Name := новый Car; -- см. 4.8
George : Person_Name := новый Person(M);
...
George.Vehicle := Your_Car;


Spec-Zone.ru

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