2012-05-07 1 views
3

상위 패키지에서 하위 패키지 선언에 액세스 할 수 있습니까?하위 패키지 선언에 액세스

-- parent.ads 
package Parent is 
    package Child is 
     type Child_Type is (A, B, C); 
    end Child; 
    use Child; 

    procedure F(A : Child_Type); 
end Parent; 

을 그리고 어쩌면 내가 그 자식 패키지를 사용하여 불가능하다고 생각하기 때문에이 작업을 수행하는 또 다른 방법 ... 일반적으로

+1

다른 질문에 답하는 중에 go (http://stackoverflow.com/a/10515906/40851)했습니다. 하위 패키지 대신 형제 패키지를 사용합니다. –

답변

1

아니, 거기 :

-- parent.ads 
package Parent is 
    procedure F(A : Child_Type); 
end Parent; 

-- parent-child.ads 
package Parent.Child is 
    type Child_Type is (A, B, C); 
end Parent.Child; 

중첩 된 버전은 잘 작동 ; 두 번째 예제는 에 F이 선언 된 경우 Child의 사양을 알고 있기 때문에 작동합니다. 이 주제에 대한 previous question에 비추어 공통 사양의 여러 구현을 분리하는 확실한 방법을 원할 수 있습니다. 이 관련 Q&A은 상속을 사용하는 방법과 컴파일 할 때 라이브러리 기반 메커니즘을 사용하는 방법 중 하나를 사용하는 두 가지 방법에 대해 설명합니다.

+0

그래서 제가 가지고있는 유일한 해결책은 템플릿 패키지의 매개 변수로서 패키지를 generic으로 만드는 것입니다 ... –

+0

더 많은 지식을 가진 참가자에게 연기하겠습니다 만, 나는 그것이 당신의 유일한 해결책이라고 말하는 충분한 정보가 있다고 생각하지 않습니다. 상속이 적절하지 않은 경우 컴파일시에 하위 본문을 제공 할 수 있습니다. 이제 가야 해. – trashgod

1

당신이 찾고있는 것이 private 하위 패키지라고 생각합니다. 이는 일반적으로 중첩 된 예제와 같은 방식으로 작동하지만 상위 본문 외부에서는 액세스 할 수 없습니다. 따라서

:

private package Parent.Child is 
    type Child_Type is (A,B,C); 
end Parent.Child; 

...

package Parent is 
    procedure F; 
end Parent; 

...

with Ada.Text_Io; 
with Parent.Child; 
package body Parent is 
    procedure F is 
    begin 
     for A in Parent.Child.Child_Type'Range loop 
     Ada.Text_Io.Put_Line (Parent.Child.Child_Type'Image (A)); 
     end loop; 
    end F; 
end Parent; 

컴파일하지만, 경우 (상위 사양에 자녀와 함께 기억하는 것이 확인되어 매개 변수를 F으로 설정 한 것처럼) 자녀가 부모가 먼저 존재해야하므로 순환 종속성이 생깁니다.

는 따라서 정말 당신이 모두 부모 이 문제에 대한 실제 솔루션인지 아이에게 공개하고 싶은 에 따라 달라집니다.

+0

사실 나는 자식 패키지를 별도의 파일에 가지고 있어야하며 부모 패키지에 투명하게 있어야합니다. 그래서 하위 패키지가있는 솔루션을 찾고 있습니다 : 선언을 포함 할 수 있으며 별도의 파일에있을 수 있습니다. 타입의 선언에는'separate'를 사용할 수 없습니다. 그래서 여전히 같은 문제가 있습니다. 형식 선언을 구분해야합니다. –

+0

@JulioGuerra 형식 선언을 parent.child heirachy 어딘가에 가져야합니까? 그렇지 않다면, type_type을 parent_types.ads에 넣고 parent.ads & parent.child.ads에이 파일을 넣으면 어떨까요? – NWS

+0

이것은 불가능합니다 : "'with'는 컨텍스트 절에만 나타날 수 있습니다."는 패키지 외부에 있습니다. –

1

훌리오, 스펙 파일에 선언 형식 (mytypes.ads)

package Mytypes is 

    type Fruit is (Apple, Pear, Pineapple, Banana, Poison_Apple); 
    subtype Safe_Fruit is Fruit range Apple .. Banana; 

end Mytypes; 

... 여러 다른 사람을 Withed :

with Mytypes; 
package Parent is 

    function Permission (F : in Mytypes.Fruit) return Boolean; 

end Parent; 

...

package body Parent is 

    function Permission (F : in Mytypes.Fruit) return Boolean is 
    begin 
     return F in Mytypes.Safe_Fruit; 
    end Permission; 

end Parent; 

...

...

with Ada.Text_Io; 
package body Parent.Child is 

    procedure Eat (F : in Mytypes.Fruit) is 
    begin 
     if Parent.Permission (F) then 
     Ada.Text_Io.Put_Line ("Eating " & Mytypes.Fruit'Image (F)); 
     else 
     Ada.Text_Io.Put_Line ("Forbidden to eat " & Mytypes.Fruit'Image (F)); 
     end if; 
    end Eat; 

end Parent.Child; 

...

with Mytypes; 
with Parent.Child; 

procedure Main is 

begin 

    for I in Mytypes.Fruit'Range loop 
     Parent.Child.Eat (I); 
    end loop; 

end Main; 

그것은 컴파일 :

$ gnatmake main.adb 
gcc-4.4 -c parent-child.adb 
gnatbind -x main.ali 
gnatlink main.ali 

이 실행 :

$ ./main 
Eating APPLE 
Eating PEAR 
Eating PINEAPPLE 
Eating BANANA 
Forbidden to eat POISON_APPLE 

이 당신이 시도 무엇인가?

+0

완전한 예제를 쓸 필요가 없었습니다. 그래서 타입을 컴파일 단위 인 패키지에 넣었습니다. 예, 작동하지만 나에게 의미/논리 문제가 있습니다.이 유형은 상위 패키지에 속하며 논리는이 패키지에 포함될 것입니다.이 패키지는 분리가 불가능합니다. ( –