1

我想在Ada.sequential_IO上放置一个包装器或外观。这有点难看,但我正在尝试使用一些自动翻译的代码。所以我有:

with Ada.sequential_IO;

generic

     type element_type is private;

package queue_file is

     package implementation is new Ada.sequential_IO (element_type);

     subtype instance is implementation.file_type; 

     function eofQ (channel : instance) return Boolean renames implementation.end_of_file;
     procedure readQ (channel : in instance;  item : out element_type) renames implementation.read;
     -- etc.

end queue_file;

这一切都很好,但名称queue_file.implementation是可见的。我试图将它移到私有部分并编写包实现是私有的,但它没有它。那么有什么办法可以隐藏名字吗?

4

1 回答 1

2

你不能做你想做的事,至少不能打破对implementationsubtype instance is implementation.file_type;

例子:

private with Ada.Sequential_IO;

generic
    type element_type is private;
package queue_file is

    type instance is limited private;

    function eofQ (channel : instance) return Boolean;
    procedure readQ (channel : in instance;  item : out element_type);
    -- SUBPROGRAMS  FOR SEQUENTIAL_IO INTERFACE  --
    procedure Open
      (File : in out instance;
       Name : String;
       Write: Boolean;
       Form : String := "");

    procedure Read  (File : instance; Item : out Element_Type);
    procedure Write (File : instance; Item : Element_Type);
    -- etc.
private
    package implementation is new Ada.sequential_IO (element_type);

    type instance is new implementation.file_type;
end queue_file;

Pragma Ada_2012;
package body queue_file is

    function eofQ (channel : instance) return Boolean is
      ( implementation.end_of_file( implementation.File_Type(channel) ) );

    procedure readQ (channel : in instance;  item : out element_type) is
    use implementation;
    begin
    implementation.read( File_Type(Channel), item );
    end readQ;

    procedure Open
      (File : in out instance;
       Name : String;
       Write: Boolean;
       Form : String := "") is
    use implementation;
    begin
    Open(
         File => File_Type(File),
         Mode => (if Write then Out_File else In_File),
         Name => Name,
         Form => Form
        );
    end Open;

    -- left as an exercise      
    procedure Read  (File : instance; Item : out Element_Type) is null;
    procedure Write (File : instance; Item : Element_Type) is null;
    -- etc.
end queue_file;
于 2013-10-23T01:21:47.230 回答