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 для выполнения осуществляется динамически на основании тэга фактического параметра. Это пример диспетчерской операции ( операции посылки ) , характеризующей особенности выполнения операций над обьектами широкого типа. СОВЕТЫ: * Избегайте исключений в совмещенных операциях, которые неизвестны пользователю. |
| Оглавление| |