Введение в программирование - Учебное пособие (Корочкин А. В.)

16.4 операции над тэговыми типами

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

В пакете AVTO для расширенных типов Ford и Opel определе­ны новые операции,

procedure Glass (Y : out   Opel); procedure Cord (X : out   Ford );

Кроме того, в пакете определена операция Motor , которая явля­ется совмещенной для трех типов.

В языке допускаются определения операций с одинаковыми именами ( совмещение операций ), при которых операции имеют одинаковые имена, но разную реализацию ( разные тела ). Например, операции Get определенные в предопределенном пакете Text_IO явяляются совмещенными:

procedure   Get (Item :   out  Character);

205

204

Ада 95. Введение в программирование

Глава 16. Обьектно-орпептированное программирование

procedure   Get (Item :   out    Enum );

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

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

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

Таким образом, язык обеспечивает две возможности реализации операции посылки:

•   статическую при компиляции

•   динамическую при выполнении программы.

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

in             integer);

in             Data);

tn            Color' Class ) ;

procedure              Bond ( X

procedure              Bond (X

procedure              Bond {X

Операция    Bond  является совмещенной для формальных паря мет ров трех типов. Вызов в программе процедуры   Bond связан с выбор­ом одной реализации ее тела, которая выполняется на основании типа ее    параметра    X. Для первых двух версий выбор осуществляется

статически - при компиляции, а для третьей - динамически при вы­полнении программы.

Диспетчерский вызов может использовать тело, описание кото­рого невидимо в месте вызова.

Тип широкого класса T'Class не имеет собственных примитивных операций и для него они определяются пользователем. Операции широкого класса применимы к обьектам любого типа внутри класса Т.

П Например :

in out Cars ' Class ) is

procedure Control (X begin

Motor ( X ); end Cars;

Процедура Control имеет аргумент типа широкого класса. В теле процедуры используется подпрограмма Motor, которая в пакете AVTO определена для трех типов, входящих в класс Cars'Class : Ford , Opel , Cars. Вызов процедуры Control выполняется с подстановкой фактического параметра, имющего тип Cars'Class. Выбор ( одной из трех ) процедур Motor для выполнения осуществляется динамически на основании тэга фактического параметра. Это пример диспетчерской операции ( операции посылки ) , характеризующей особенности выполнения операций над обьектами широкого типа.

СОВЕТЫ:

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