Ada:将实现名称隐藏在(通用)包中

时间:2013-10-22 22:55:27

标签: package private ada

我想在 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 是可见的。我试图将它移到私有部分并写包实现是私有的,但它没有它。那么有什么方法可以隐藏这个名字吗?

1 个答案:

答案 0 :(得分:2)

你不能做你想做的事情,至少不能打破implementation

给出subtype 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;