Справочник по Ada 2012
Пример использования удаленного доступа к типу класса
Примеры
Пример использования удаленного доступа к типу класса для достижения динамической связи между активными разделами:
пакет Tapes есть
pragma Pure(Tapes);
тип Tape является абстрактным помеченным ограниченным частным;
-- Примитивные операции диспетчеризации, где
-- Tape управляет операндом
процедура Copy (From, To : доступ Tape; Num_Recs : вход Natural) является абстрактной;
процедура Rewind (T : доступ Tape) является абстрактной;
-- Больше операций
частное
тип Tape есть ...
конец Tapes;
pragma Pure(Tapes);
тип Tape является абстрактным помеченным ограниченным частным;
-- Примитивные операции диспетчеризации, где
-- Tape управляет операндом
процедура Copy (From, To : доступ Tape; Num_Recs : вход Natural) является абстрактной;
процедура Rewind (T : доступ Tape) является абстрактной;
-- Больше операций
частное
тип Tape есть ...
конец Tapes;
с Tapes;
пакет Name_Server есть
pragma Remote_Call_Interface;
-- Динамическая привязка к удаленным операциям достигается
-- с использованием доступа к ограниченному типу класса Tape_Ptr
тип Tape_Ptr есть доступ ко всем Tapes.Tape'Class;
-- Следующие статически связанные удаленные операции
-- позволяют в этом примере возможность сервера имен
функция Find (Name : String) возвращает Tape_Ptr;
процедура Register (Name : вход String; T : вход Tape_Ptr);
процедура Remove (T : вход Tape_Ptr);
-- Больше операций
конец Name_Server;
пакет Name_Server есть
pragma Remote_Call_Interface;
-- Динамическая привязка к удаленным операциям достигается
-- с использованием доступа к ограниченному типу класса Tape_Ptr
тип Tape_Ptr есть доступ ко всем Tapes.Tape'Class;
-- Следующие статически связанные удаленные операции
-- позволяют в этом примере возможность сервера имен
функция Find (Name : String) возвращает Tape_Ptr;
процедура Register (Name : вход String; T : вход Tape_Ptr);
процедура Remove (T : вход Tape_Ptr);
-- Больше операций
конец Name_Server;
пакет Tape_Driver есть
-- Объявления не показаны, они здесь неважны
конец Tape_Driver;
-- Объявления не показаны, они здесь неважны
конец Tape_Driver;
с Tapes, Name_Server;
пакет тела Tape_Driver есть
тип New_Tape новый Tapes.Tape с ...
процедура Copy
(From, To : доступ New_Tape; Num_Recs: вход Natural) есть
начинается
. . .
конец Copy;
процедура Rewind (T : доступ New_Tape) есть
начинается
. . .
конец Rewind;
-- Объекты, удаленно доступные через использование
-- операций Name_Server
Tape1, Tape2 : alias New_Tape;
начинается
Name_Server.Register ("NINE-TRACK", Tape1'Access);
Name_Server.Register ("SEVEN-TRACK", Tape2'Access);
конец Tape_Driver;
пакет тела Tape_Driver есть
тип New_Tape новый Tapes.Tape с ...
процедура Copy
(From, To : доступ New_Tape; Num_Recs: вход Natural) есть
начинается
. . .
конец Copy;
процедура Rewind (T : доступ New_Tape) есть
начинается
. . .
конец Rewind;
-- Объекты, удаленно доступные через использование
-- операций Name_Server
Tape1, Tape2 : alias New_Tape;
начинается
Name_Server.Register ("NINE-TRACK", Tape1'Access);
Name_Server.Register ("SEVEN-TRACK", Tape2'Access);
конец Tape_Driver;
с Tapes, Name_Server;
-- Tape_Driver не нужен и поэтому не упоминается в with_clause
процедура Tape_Client есть
T1, T2 : Name_Server.Tape_Ptr;
начинается
T1 := Name_Server.Find ("NINE-TRACK");
T2 := Name_Server.Find ("SEVEN-TRACK");
Tapes.Rewind (T1);
Tapes.Rewind (T2);
Tapes.Copy (T1, T2, 3);
конец Tape_Client;
-- Tape_Driver не нужен и поэтому не упоминается в with_clause
процедура Tape_Client есть
T1, T2 : Name_Server.Tape_Ptr;
начинается
T1 := Name_Server.Find ("NINE-TRACK");
T2 := Name_Server.Find ("SEVEN-TRACK");
Tapes.Rewind (T1);
Tapes.Rewind (T2);
Tapes.Copy (T1, T2, 3);
конец Tape_Client;
Примечания к примеру:
Этот абзац был удален.
- Пакет Tapes предоставляет необходимые объявления типа и его примитивных операций.
- Name_Server — это пакет удаленного вызова интерфейса, который разработан в отдельном активном разделе для предоставления необходимых служб именования (таких как Register и Find) для всей распределенной программы через удаленные вызовы подпрограмм.
- Tape_Driver — это обычный пакет, который разработан в разделе, настроенном на узле обработки, подключенном к устройствам ленты. Абстрактные операции переопределяются для поддержки локально объявленных устройств ленты (Tape1, Tape2). Пакет не виден своим клиентам, но он экспортирует устройства ленты (как удаленные объекты) через службы Name_Server. Это позволяет динамически добавлять, удалять или заменять устройства ленты без необходимости изменения кода клиентов.
- Процедура Tape_Client ссылается только на объявления в пакетах Tapes и Name_Server. Перед первым использованием ленты необходимо запросить у Name_Server системный идентификатор этой ленты. После этого можно использовать этот идентификатор для доступа к устройству ленты.
- Значения типа удаленного доступа Tape_Ptr включают необходимую информацию для завершения операций удаленной диспетчеризации, которые возникают при обращении к управляющим операндам T1 и T2.