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


Языки программирования. Практический сравнительный анализ - стр. 206


Имя подтипа служит сокращением для сочетания ограничиваемого типа (назовем его БАЗОВЫМ ТИПОМ) и ограничения. Когда такое имя используется при объявлении объекта, считается, что объявлен соответственно ограниченный объект базового типа. Когда такое имя применяется в спецификации параметра процедуры или функции, то аргументом может быть любой объект базового типа, удовлетворяющий соответствующему ограничению. Присваивания объектам различных подтипов одного и того же базового типа не подвергаются никакому дополнительному контролю, кроме принадлежности присваиваемого значения подклассу значений, выделяемого подтипом левой части.

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

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

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

Вместе с тем при необходимости между такими (родственными) типами допустимы явные преобразования типа.

 

4.11.8.1. Лес типов

Назовем лесом типов ориентированный граф, вершинами которого служат типы, а дуги соединяют родительский тип с производным. Вот пример леса типов

 

                             

                        INTEGER                    месяц

                        /     \                  /       \




- Начало -  - Назад -  - Вперед -