1
Example of using a remote access−to−class−wide type to achieve dynamic binding across active partitions:
2
package Tapes is pragma Pure(Tapes); type Tape is abstract tagged limited private; −− Primitive dispatching operations where −− Tape is controlling operand procedure Copy (From, To : access Tape; Num_Recs : in Natural) is abstract; procedure Rewind (T : access Tape) is abstract; −− More operations private type Tape is ... end Tapes;
3
with Tapes; package Name_Server is pragma Remote_Call_Interface; −− Dynamic binding to remote operations is achieved −− using the access−to−limited−class−wide type Tape_Ptr type Tape_Ptr is access all Tapes.Tape'Class; −− The following statically bound remote operations −− allow for a name−server capability in this example function Find (Name : String) return Tape_Ptr; procedure Register (Name : in String; T : in Tape_Ptr); procedure Remove (T : in Tape_Ptr); −− More operations end Name_Server;
4
package Tape_Driver is −− Declarations are not shown, they are irrelevant here end Tape_Driver;
5
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; −− Objects remotely accessible through use −− of Name_Server operations Tape1, Tape2 : aliased New_Tape; begin Name_Server.Register ("NINE−TRACK", Tape1'Access); Name_Server.Register ("SEVEN−TRACK", Tape2'Access); end Tape_Driver;
6
with Tapes, Name_Server; −− Tape_Driver is not needed and thus not mentioned in the 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;
7
Notes on the example:
8/1
This paragraph was deleted.
9
10
11
12
13