3.3. ТИПЫ И ПОДТИПЫ

Тип характеризуется множеством значений и множеством операций.

Существует несколько классов типов. Скалярные типы — это целые и вещественные типы и типы, определенные перечислением своих значений; значения этих типов не имеют компонент. Индексируемый и именуемый типы являются составными. Значение составного типа состоит из значений компонент. Ссылочный тип — это тип, значения которого обеспечивают доступ к объектам. Личные типы — это типы, для которых полностью определяется набор возможных значений, но непосредственный доступ к ним пользователей невозможен. Наконец, существуют задачные типы. (Личные типы описаны в гл. 7, задачные — .в гл. 9, остальные — в гл. 3.)

Именуемые и личные типы могут иметь специальные компоненты, называемые дискриминантами, значения которых различают альтернативные формы значений одного из этих типов. Если личный тип имеет дискриминанты, они известны пользователям типа. Следовательно, личный тип известен только своим именем, своими дискриминантами, если они есть, и соответствующим набором операций.

Набор возможных значений данного типа может зависеть от условия, которое называется ограничением (сюда не относятся случаи без ограничения), значение удовлетворяет ограничению, если оно удовлетворяет соответствующему условию. Подтип — это тип вместе с ограничением; говорят, что значение принадлежит подтипу, если оно принадлежит типу и удовлетворяет ограничению; данный тип называется базовым типом подтипа. Тип является подтипом самого себя; такой подтип называется неограниченным; он соответствует условию, которое не налагает никаких ограничений. Базовым типом является он сам.

Множество операций, определенных над конкретным типом, определено и для любого его подтипа; однако переменной данного подтипа можно присвоить значение только этого подтипа. Дополнительные операции, например квалификация (в квалификационном выражении), неявно определяются описанием подтипа.

Для объектов некоторых типов определено начальное значение по умолчанию, некоторые другие типы имеют выражения по умолчанию, определенные для всех или части своих компонент. Некоторые операции над типами и подтипами называются атрибутами; эти операции обозначаются именами, описанными в разд. 4.1.4.

Термин подкомпонента используется в описании языка вместо термина компонента, чтобы указать компоненту другой компоненты или подкомпоненты. Если нет других подкомпонент, используется термин компонента.

Подкомпонента значения данного типа не должна быть этого же типа.

Имя класса типов используется в описании языка для квалификации объектов и значений, принадлежащих к типу рассматриваемого класса. Например, термин индексируемый объект используется для объекта индексируемого типа; аналогично термин ссылочное значение используется для значения ссылочного типа.

Примечание. Набор значений подтипа — это подмножество значений базового типа. Это подмножество не обязано быть собственным подмножеством; оно может быть пустым.

Ссылки: атрибут 4.1.4, вещественный тип 3.5.6, задачный тип 9,1, именуемый тип 3.7, индексируемый тип 3.6, квалифицированное выражение 4.7, компонента записи 3.7, компонента массива 3.6, личный тип 7.4, объект 3.2.1, ограничение дискриминанта 3.7.2, описание подтипа 3.3.2, описание типа 3.3.1, перечислимый тип 3.5.1, присваивание 5.2, ссылочный тип 3.8, целый тип 3.5.4.

3.3.1. ОПИСАНИЯ ТИПОВ

Описание типа объявляет тип.

описание-типа ::= полное-описание-типа    | неполное-описание-типа | описание-личного-типаполное-описание-типа ::=    type идентификатор [раздел-дискриминантов]       is определение-типа; определение-типа ::= определение-перечислимого-типа    | определение-целого-типа    | определение-вещественного-типа    | определение-индексируемого-типа    | определение-именуемого-типа    | определение-ссылочного-типа    | определение-производного-типа

Предвыполнение полного описания типа состоит из предвыполнения раздела дискриминантов, если он есть (исключая случай использования полного описания типа для неполного описания типа или описания личного типа), и предвыполнения определения типа.

Типы, созданные в результате предвыполнения различных определений, являются различными. Более того, Предвыполнение определения типа для числовых или производных типов' создает как базовый тип, так и подтип базового типа; то же самое выполняется для определения ограниченного индексируемого типа (одной из двух форм определения индексируемого типа).

Простое имя в полном описании типа обозначает описанный тип, если только описание типа не объявляет базовый тип и подтип базового типа; в этом случае простое имя обозначает подтип, а базовый тип является анонимным. Тип называется анонимным, если он не имеет простого имени. Для наглядности в этом стандарте время от времени используется псевдоимя анонимного типа, написанное курсивом, там, где обычно по синтаксису требуется идентификатор.

Примеры определений типов:

(WHITE, RED, YELLOW, GREEN, BLUE. BROWN, BLACK)

range 1 .. 72

array(1 .. 10) of INTEGER

Примеры описаний типов:

type COLOR is (WHITE, RED, YELLOW, GREEN, BLUE. BROWN, BLACK):

type COLUMN is range 1 .. 72; type TABLE is array(1 .. 10) of INTEGER;

Примечание. Два определения типа всегда определяют два различных типа, даже если они текстуально идентичны. Таким образом, данные ниже описания А и В задают различные индексируемые типы:

А : array(1 .. 10) of BOOLEAN;

В : array(1 .. 10) of BOOLEAN;

Если А и В описаны в групповом описании объектов, то их типы (анонимные) тем не менее различны, так как это групповое описание объектов эквивалентно двум приведенным выше единичным описаниям.

А, В : array(1 .. 10) of BOOLEAN;

Неполные описания типов используются для определения рекурсивных и взаимосвязанных типов (см. 3.8.1). Описания личных типов используются в спецификациях пакетов и в описаниях параметров настройки .(см. 7.4 и 12.1).

Ссыпки: базовый тип 3.3, групповое описание объектов 3.2, зарезервированное слово 2.9, идентификатор 2.3, неполное описание типа 3.8.1, ограниченный подтип 3.3, описание 3.1, описание личного типа 7.4, определение вещественного типа 3.5.6, определение индексируемого ограниченного типа 3.6, определение индексируемого типа 3.6, определение перечислимого типа 3.5.1, определение производного типа 3.4, определение ссылочного типа 3.8, определение целого типа 3.5.4, Предвыполнение 3.9, производный тип 3.4, раздел дискриминантов 3.7.1, тип 3.3, числовой тип 3.5.

3.3.2. ОПИСАНИЯ ПОДТИПОВ

Описание подтипа объявляет подтип.

описание-подтипа ::= subtype идентификатор is указание-подтипа;указание-подтипа ::= обозначение-типа [ограничение] обозначение-типа ::= имя -типа|имя- подтипа ограничение ::= ограничение-диапазона             | ограничение-плавающего-типа              | ограничение - фиксированного - типа              | ограничение-индекса              | ограничение-дискриминанта

Обозначение типа обозначает тип или подтип. Если обозначение типа — имя типа, то оно обозначает этот тип, а также соответствующий неограниченный подтип. Базовым типом, соответствующим обозначению типа, является по определению базовый тип типа или подтипа, указанного обозначением типа.

Указание подтипа определяет подтип базового типа, соответствующего обозначению типа.

Если в указании подтипа после обозначения типа стоит ограничение индекса, то обозначение типа не должно обозначать подтип с уже ограниченным индексом. Аналогично для ограничения дискриминанта: обозначение типа не должно иметь ограничение дискриминанта.

Предвыполнение описания подтипа состоит из предвыполнения указания подтипа. Это предвыполнение создает подтип. Если указание подтипа не включает ограничение, то определяемый подтип тот же, что и указанный обозначением типа подтип. Предвыполнение указания подтипа, содержащего ограничение, происходит следующим образом:

а) вначале предвыполняется ограничение;

б) ограничение проверяется на совместимость с типом или подтипом, заданным обозначением типа.

После предвыполнения ограничения получается условие, наложенное ограничением. (Правила предвыполнения ограничения таковы, что выражения и диапазоны ограничений вычисляются при предвыполнении всех этих ограничений.) Правила определения совместимости даны в соответствующих разделах для каждой формы ограничения. Эти правила таковы, что если ограничение совместимо с подтипом, то наложенное ограничением условие не может противоречить никакому условию, уже заданному для значений этого подтипа. В противном случае возбуждается исключение CONSTRAINT_ERROR.

Примеры описаний подтипов:

subtype RAINBOW is COLOR range RED .. BLUE;    -- см. 3.3.1 subtype REOBLUE is RAINBOW; subtype INT is INTEGER; subtype SMALUNT is INTEGER range -10 .. 10; subtype UPTOK is COLUMN range 1 .. К;        -- см. 3.3.1 subtype SQUARE is MATRIX(1 .. 10, 1 .. 10);    -- см. 3.6 subtype MALE is PERSON(SEX => M);             -- см. 3.8

Примечание. Описание подтипа не определяет нового типа.

Ссылки: базовый тип3, выражение 4.4, вычисление 4.5, дискриминант 3.3, зарезервированное слово 2.9, имя типа 3.3.1, исключение CONSTRAINT_ERROR 11.1, неограниченный подтип 3.3, ограничение диапазона 3.5, ограничение дискриминанта 3.7.2, ограничение индекса 3.6.1, ограничение плавающего типа 3.5.7, ограничение фиксированного типа 3.5.9, описание 3.1, подтип 3.3, предвыполнение 3.9, совместимость с ограничением диапазона 3.5, совместимость с ограничением дискриминанта 3.7.2, совместимость с ограничением индекса 3.6.1, совместимость с ограничением плавающего типа 3.5.7, совместимость с ограничением фиксированного типа 3.5.9, тип 3.3.

3.3.3. КЛАССИФИКАЦИЯ ОПЕРАЦИЙ

Множество операций над типом включает явно описанные подпрограммы с параметромили результатом этого типа; такие подпрограммы необходимо описывать после описания типа.

Остальные операции неявно описываются сразу после каждого описания типа. К ним относятся базовые операции, предопределенные операции (см. 4.5) и литералы перечисления. Описанием производного типа неявно задаются операции, включающие производные подпрограммы. Считается, что описания операций расположены между описанием типа и последующим описанием, если таковое имеется. Неявные описания производных подпрограмм расположены последними. Базовыми операциями являются:

• Присваивание (в операторах присваивания и инициализациях), генератор, проверка принадлежности или форма управления с промежуточной проверкой.

• Именуемая компонента, индексируемая компонента или отрезок.

• Квалификация (в квалифицированных выражениях), явное преобразование типа или неявное преобразование значения типа универсальный-целый или универсальный-вещественный в соответствующее значение другого числового типа.

• Числовой литерал (для универсального типа), литерал null (для ссылочного типа), строковый литерал, агрегат или атрибут.

Для каждого типа или подтипа Т определен следующий атрибут:

Т'BASE

Базовый тип Т. Этот атрибут допустим только в качестве префикса имени другого атрибута, например T'BASE'FIRST.

Примечание. Каждый литерал — это операция, в результате выполнения которой вырабатывается сооветствующее значение (см. 4.2). Подобно этому, агрегат — это операция, в результате выполнения которой вырабатывается значение составного типа (см. 4.3). Некоторые операции оперируют со значениями данного типа, например предопределенные операции и некоторые подпрограммы и атрибуты. Некоторые операции возвращают значение данного типа, например литералы и некоторые функции, атрибуты и предопределенные операции. Присваивание — это операция, которая оперирует с объектом и значением. В результате вычисления операции, соответствующей именуемой компоненте, индексируемой компоненте или отрезку, вырабатывается объект или значение, обозначенное этой формой имени.

Ссылки: агрегат 4.3, атрибут 4.1.4, генератор 4.8, именуемая компонента 4.1.3, индексируемая компонента 4.1.1., квалифицированное выражение 4.7, литерал 4.2, литерал перечисления 3.5.1, начальное значение 3.2.1, объект 3.2.1, 3.2, описание типа 3.3.1, отрезок 4.1.2, подпрограмма 6, подтип 3.3, предопределенная операция 4.5, преобразование 4.6, присваивание 5.2, проверка принадлежности 4.5, 4.5.2, производная подпрограмма 3.4, пустой литерал 3.8, символьный литерал 2.5, составной тип 3.3, строковый литерал 2.6, тип 3.3, универсальный вещественный тип 3.5.6, универсальный тип 4.10, универсальный целый тип 3.5.4, управление с промежуточной проверкой 4.5, 4.5.1, формальный параметр 6.1, функция 6.5, числовой литерал 2.4, числовой тип 3.5.