3.4. ПРОИЗВОДНЫЕ ТИПЫ

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

определение-производного-типа ::= new указание-подтипа

Указание подтипа после зарезервированного слова new определяет родительский подтип. Родительский тип является базовым для родительского подтипа. Если для родительского подтипа существует ограничение, то подобное ограничение существует и для производного подтипа; разница состоит только в том, что для ограничения диапазона и для ограничения плавающего или фиксированного типов, которое включает ограничение диапазона, значение каждой границы заменяется на соответствующее значение производного типа. Производный тип обладает следующими свойствами:

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

• Для каждой базовой операции над родительским типом существует соответствующая базовая операция над производным типом. Допускается явное преобразование значения родительского типа в соответствующее значение производного типа и наоборот, как поясняется в разд. 4.6.

• Для каждого литерала перечисления или предопределенной операции над родительским типом существует соответствующая операция над производным типом.

• Если родительский тип — задачный тип, то для каждого входа родительского типа существует соответствующий вход производного типа.

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

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

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

• Подпрограммы, которые являются операциями над родительским типом, называются наследуемыми. Для каждой наследуемой подпрограммы родительского типа имеется соответствующая производная подпрограмма над производным типом. Могут быть выделены два сорта наследуемых подпрограмм. Во-первых, если родительский тип описан непосредственно в видимом разделе пакета, то подпрограмма, явно описанная непосредственно в видимом разделе, становится наследуемой после конца видимого раздела (если подпрограмма — операция над родительским типом). (Явное описание — это описание подпрограммы, описание переименования подпрограммы или конкретизация настройки.) Во-вторых, если родительский тип сам является производным и не описан в видимом разделе пакета, то подпрограмма, которая стала наследуемой, и она не скрыта наследуемой подпрограммой первого сорта, является далее наследуемой.

Описание производного типа неявно описывает операции над производным типом. Неявные описания любых производных подпрограмм следуют за описанием производного типа.

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

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

Если производный или личный тип описан непосредственно в видимом разделе пакета, то в нем этот тип не должен использоваться как родительский тип в определении производного типа. (Для личных типов см. также разд. 7.4.1.)

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

Примеры:

type LOCAL-COORDINATE is new COORDINATE; —- Два различных типа type MIDWEEK is new DAY range TUE .. THU; —- CM. 3.5.1 type COUNTER is new POSITIVE; -- тот же диапазон, что и у POSITIVE type SPECIAL-KEY is new KEYMANAGER.KEY; — CM. 7.4.2-- Производные подпрограммы имеют следующие спецификации:--procedure GETKEY(K : out SPECIAL_KEY); -—function "<"(X,Y : SPECIAL_KEY) return BOOLEAN;

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

Скрытие производной подпрограммы допустимо даже в одной и той же зоне описания (см. 8.3). Производная подпрограмма скрывает предопределенную операцию, имеющую тот же профиль типа параметров и результата (см. 6.6).

Описание настраиваемой подпрограммы не наследуется, поскольку оно описывает настраиваемый модуль, а не подпрограмму. С другой стороны, конкретизация настраиваемой подпрограммы является (ненастраиваемой) подпрограммой, которая является наследуемой, если она удовлетворяет требованиям наследуемости подпрограмм.

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

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

Если параметр производной подпрограммы принадлежит производному типу, подтип это- .-, го параметра не обязан иметь значение, общее с производным подтипом.

Ссылки: агрегат 4.3, атрибут 4.1.4, базовая операция 3.3.3, базовый тип 3.3, вид 6.1, видимый раздел 7.2, вход 9.5, вызов функции 6.4, выражение по умолчанию 3.2.1, граница диапазона 3.5, дискриминант 3.3, зарезервированное слово 2.9, зона описания 8.1, класс типа 3.3, компонента 3.3, литерал 4.2, литерал перечисления 3.5.1, личный тип 7.4, логический тип 3.5.3, набор 3.8, начальное значение по умолчанию для ссылочного типа 3.8, непосредственно в 8.1, неявное описание 3.1, ограничение 3.3, ограничение диапазона 3.5, ограничение плавающего типа 3.5.7, ограничение фиксированного типа 3.5.9, оператор вызова процедуры 6.4, описание 3.1, описание настройки 12.1, определение типа 3.3.1, отрезок 4.1.2, пакет 7, подпрограмма 6, подтип 3.3, предвыполнение 3.9, предопределенная операция 4.5, преобразование 4.6, процедура б, совмещение 6.6, 8.7, сопоставление параметров 6.4, составной тип 3.3, спецификатор представления 13.1, спецификация пакета 7.1, спецификация подпрограммы 6.1, ссылочное значение 3.8, тип 3.3, указание подтипа 3.3.2, фактический параметр 6.4.1, формальный параметр 6.1.