Определение производного типа задает новый (базовый) тип, который наследует свойства родительского типа; новый тип называется производным типом. Определение производного типа создает одновременно производный подтип, являющийся подтипом производного типа.
определение_производного_типа : : = | ||||
new указание_подтипа |
Указание подтипа после зарезервированного слова new определяет родительский подтип. Родительский тип является базовым для родительского подтипа. Если для родительского подтипа существует ограничение, то подобное ограничение существует и для производного подтипа; разница состоит только в том, что для ограничения диапазона и для ограничения плавающего или фиксированного типов, которое включает ограничение диапазона, значение каждой границы заменяется на соответствующее значение производного типа. Производный тип обладает следующими свойствами:
Производный тип относится к тому же самому классу типов, что и родительский тип. Набор возможных значений для производного типа есть копия набора возможных значений для родительского типа. Если родительский тип составной, такие же компоненты существуют и у производного типа, а подтип соответствующих компонентов тот же самый;
Для каждой базовой операции над родительским типом существует соответствующая базовая операция над производным типом. Допускается явное преобразование значения родительского типа в соответствующее значение производного типа и наоборот, как поясняется в разд.4.6;
Для каждого литерала перечисления или для каждой предопределенной операции над родительским типом существует соответствующая операция над производным типом;
Если родительский тип - задачный тип, то для каждого входа родительского типа существует соответствующий вход производного типа;
Если выражение по умолчанию существует для компонентов объекта, имеющего родительский тип, то то же самое выражение используется для соответствующего компонента объекта производного типа;
Если родительский тип - ссылочный тип, то родительский и производный типы имеют один и тот же набор значений; существует пустое ссылочное значение для производного типа, которое по умолчанию является начальным значением этого типа;
Если существует явный спецификатор представления для родительского типа и если этот спецификатор расположен до (но не после) определения производного типа, соответствующий спецификатор представления неявно задан и для производного типа;
Некоторые подпрограммы, являющиеся операциями над родительским типом, называются наследуемыми. Для каждой наследуемой подпрограммы родительского типа имеется соответствующая производная подпрограмма над производным типом. Существуют два сорта наследуемых подпрограмм. Во-первых, если родительский тип описан непосредственно в видимом разделе пакета, то подпрограмма, явно описанная непосредственно в этом видимом разделе, становится наследуемой после конца видимого раздела (если подпрограмма - операция над родительским типом). (Явное описание - это описание подпрограммы, описание переименования подпрограммы или конкретизация настройки.) Во-вторых, если родительский тип сам является производным типом и не описан в видимом разделе пакета, то подпрограмма, которая стала производной, и она не скрыта наследуемой подпрограммой первого сорта, является далее наследуемой.
Описание производного типа неявно описывает в этом месте каждую операцию над производным типом. Неявные описания любых производных подпрограмм следуют за описанием производного типа.
Спецификация производной подпрограммы неявно получается систематическим замещением родительского типа на производный тип в спецификации наследуемой подпрограммы. Любой подтип родительского типа подобным образом замещается подтипом производного типа с аналогичными ограничениями (как при замене ограничения родительского подтипа на соответствующее ограничение производного подтипа). Наконец, любое выражение родительского типа становится операндом преобразования типа, которое вырабатывает результат производного типа.
Вызов производной подпрограммы эквивалентен вызову соответствующей подпрограммы родительского типа, в котором каждый фактический параметр производного типа заменяется преобразованием типа этого фактического параметра к родительскому типу (это означает, что преобразование к родительскому типу происходит перед вызовом параметров вида in и in out; обратное преобразование к производному типу происходит после вызова параметров вида in out и out, см. 6.4.1). Дополнительно, если результат вызванной функции имеет родительский тип, то он преобразуется к производному типу.
Если производный тип или личный тип описаны непосредственно в видимом разделе пакета, то в этом разделе этот тип не должен использоваться как родительский тип в определении производного типа (для личных типов см. также разд.7.4.1).
При предвыполнении определения производного типа сначала предвыполняется указание подтипа, затем создается производный тип, а затем - производный подтип.
Примеры:
type ЛОКАЛЬНАЯ_КООРДИНАТА is new КООРДИНАТА; - - два различных типа
type СЕРЕДИНА_НЕДЕЛИ is new ДЕНЬ range BTP .. ЧТВ; - - см. 3.5.1
type СЧЕТЧИК is new POSITIVE; - - тот же диапазон, что и POSITIVE
type СПЕЦИАЛЬНЫЙ_КЛЮЧ is new УПРАВЛЕНИЕ_ПО_ КЛЮЧУ . КЛЮЧ;
- - см. 7.4.2
- - Производные подпрограммы имеют следующие спецификации:
- - procedure ДАЙ_КЛЮЧ (К: out СПЕЦИАЛЬНЫЙ_КЛЮЧ);
- - function "<" (X, У: СПЕЦИАЛЬНЫЙ_КЛЮЧ) return BOOLEAN;