2013-10-22 3 views
1

Ada.sequential_IO에 래퍼 또는 파사드를 넣으려고합니다. 이것은 좀 못생긴지만 자동 번역 된 코드로 작업하려고합니다. 모두 아주 잘Ada : (일반) 패키지의 구현 이름 숨기기

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

'eofQ','readQ' 등의 서브 프로그램을 호출하지 않을 것입니다. 단지'eof','read'가 아닌가요? (또는 심지어'End_Of_File','Read'? :)) –

+0

+1 Simon : 그것들이 명시 적으로 대기열 작업이고, 정규화 된 이름, queue_file.Read 등을 사용합니다. –

+0

@Simon : Pascal 소스 코드를 자동으로 Ada로 번역합니다. 파스칼 이름 eof, read 등은 텍스트 유형의 객체 및 X 유형의 객체에 적용될 수 있기 때문에 오버로드됩니다. 관심이있을 경우 전체 세부 정보를 제공 할 수 있지만 응용 프로그램별로 다릅니다 . – Michael

답변

2

당신은 당신이 뭘 하려는지 할 수 없어 적어도 w/subtype instance is implementation.file_type;

예에 의해 주어진 implementation에 볼 수 의존 깨는 O :

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; 
+0

@ 사이먼, 수정에 감사드립니다. – Shark8