Справочник по Ada 2005
E.4.2 Пример использования удаленного доступа к типу класса
Примеры
Пример использования удаленного доступа к типу класса для достижения динамической привязки в активных разделах:
package Tapes is
pragma Pure(Tapes);
type Tape is abstract tagged limited private;
-- Первичные операции диспетчеризации, где
-- Tape является контролируемым операндом
procedure Copy (From, To : access Tape; Num_Recs : in Natural) is abstract;
procedure Rewind (T : access Tape) is abstract;
-- Дополнительные операции
private
type Tape is ...
end Tapes;
pragma Pure(Tapes);
type Tape is abstract tagged limited private;
-- Первичные операции диспетчеризации, где
-- Tape является контролируемым операндом
procedure Copy (From, To : access Tape; Num_Recs : in Natural) is abstract;
procedure Rewind (T : access Tape) is abstract;
-- Дополнительные операции
private
type Tape is ...
end Tapes;
with Tapes;
package Name_Server is
pragma Remote_Call_Interface;
-- Динамическая привязка к удаленным операциям достигается
-- с использованием доступа к ограниченному типу класса Tape_Ptr
type Tape_Ptr is access all Tapes.Tape'Class;
-- Следующие статически связанные удаленные операции
-- позволяют использовать в этом примере функционал сервера имен
function Find (Name : String) return Tape_Ptr;
procedure Register (Name : in String; T : in Tape_Ptr);
procedure Remove (T : in Tape_Ptr);
-- Дополнительные операции
end Name_Server;
package Name_Server is
pragma Remote_Call_Interface;
-- Динамическая привязка к удаленным операциям достигается
-- с использованием доступа к ограниченному типу класса Tape_Ptr
type Tape_Ptr is access all Tapes.Tape'Class;
-- Следующие статически связанные удаленные операции
-- позволяют использовать в этом примере функционал сервера имен
function Find (Name : String) return Tape_Ptr;
procedure Register (Name : in String; T : in Tape_Ptr);
procedure Remove (T : in Tape_Ptr);
-- Дополнительные операции
end Name_Server;
package Tape_Driver is
-- Объявления не показаны, они здесь не имеют значения
end Tape_Driver;
-- Объявления не показаны, они здесь не имеют значения
end Tape_Driver;
with Tapes, Name_Server;
package body Tape_Driver is
type New_Tape is new Tapes.Tape with ...
procedure Copy
(From, To : access New_Tape; Num_Recs: in Natural) is
begin
. . .
end Copy;
procedure Rewind (T : access New_Tape) is
begin
. . .
end Rewind;
-- Объекты, удаленно доступные через
-- использование операций Name_Server
Tape1, Tape2 : aliased New_Tape;
begin
Name_Server.Register ("NINE-TRACK", Tape1'Access);
Name_Server.Register ("SEVEN-TRACK", Tape2'Access);
end Tape_Driver;
package body Tape_Driver is
type New_Tape is new Tapes.Tape with ...
procedure Copy
(From, To : access New_Tape; Num_Recs: in Natural) is
begin
. . .
end Copy;
procedure Rewind (T : access New_Tape) is
begin
. . .
end Rewind;
-- Объекты, удаленно доступные через
-- использование операций Name_Server
Tape1, Tape2 : aliased New_Tape;
begin
Name_Server.Register ("NINE-TRACK", Tape1'Access);
Name_Server.Register ("SEVEN-TRACK", Tape2'Access);
end Tape_Driver;
with Tapes, Name_Server;
-- Tape_Driver не требуется и поэтому не указан вwith_clause
procedure Tape_Client is
T1, T2 : Name_Server.Tape_Ptr;
begin
T1 := Name_Server.Find ("NINE-TRACK");
T2 := Name_Server.Find ("SEVEN-TRACK");
Tapes.Rewind (T1);
Tapes.Rewind (T2);
Tapes.Copy (T1, T2, 3);
end Tape_Client;
-- Tape_Driver не требуется и поэтому не указан вwith_clause
procedure Tape_Client is
T1, T2 : Name_Server.Tape_Ptr;
begin
T1 := Name_Server.Find ("NINE-TRACK");
T2 := Name_Server.Find ("SEVEN-TRACK");
Tapes.Rewind (T1);
Tapes.Rewind (T2);
Tapes.Copy (T1, T2, 3);
end Tape_Client;
Примечания к примеру:
Этот абзац был удален.
- Пакет Tapes предоставляет необходимые объявления типа и его основных операций.
- Name_Server — это пакет интерфейса удаленных вызовов, который расшифровывается в отдельном активном разделе для предоставления необходимых служб именования (таких как Register и Find) всей распределенной программе через удаленные вызовы подпрограмм.
- Tape_Driver — это обычный пакет, который расшифровывается в разделе, настроенном на процессорном узле, подключенном к устройствам ленты. Абстрактные операции переопределяются для поддержки локально объявленных устройств ленты (Tape1, Tape2). Пакет не виден своим клиентам, но экспортирует устройства ленты (как удаленные объекты) через службы Name_Server. Это позволяет динамически добавлять, удалять или заменять устройства ленты без необходимости изменения кода клиентов.
- Процедура Tape_Client ссылается только на объявления в пакетах Tapes и Name_Server. Перед первым использованием ленты необходимо запросить у Name_Server системный идентификатор этой ленты. После этого можно использовать этот идентификатор для доступа к устройству ленты.
- Значения удаленного типа доступа Tape_Ptr включают необходимую информацию для выполнения удаленных операций диспетчеризации, которые являются результатом дескрипции управляющих операндов T1 и T2.