Справочник по Ada (Ada 2022)
E.4.2 Пример использования удаленного доступа к типу класса
Примеры
Пример использования удаленного доступа к типу класса для достижения динамической привязки через активные разделы:
package Tapes
with Pure is
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 Pure is
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
with Remote_Call_Interface is
-- Динамическая привязка к удалённым операциям достигается
-- с использованием типа доступа к ограниченному типу класса 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
with Remote_Call_Interface is
-- Динамическая привязка к удалённым операциям достигается
-- с использованием типа доступа к ограниченному типу класса 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 ...
overriding
procedure Rewind (T : access New_Tape);
overriding
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 ...
overriding
procedure Rewind (T : access New_Tape);
overriding
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.