2012-05-07 11 views
3

親パッケージから子パッケージ宣言にアクセスすることは可能ですか?子パッケージ宣言へのアクセス

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

ネストされたバージョンが正常に動作します:いいえ、

-- 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

; 2番目の例は、にFが宣言されているときに、Childの指定が分かっているために機能します。このトピックのprevious questionに照らして、共通仕様の複数の実装を分ける明確な方法が必要な場合があります。これに関連するQ&Aは、継承を使用するアプローチと、コンパイル時にライブラリベースのメカニズムを使用するアプローチの2つのアプローチについて説明しています。

+0

私が持っている唯一の解決策は、テンプレートのパラメタとして型を使用してパッケージを汎用化することです。 –

+0

私は知識の豊富な参加者に延期しますが、それはあなたの_only_ソリューションだと言う十分な情報はないと思います。継承が不適切な場合は、コンパイル時に子体を提供することができます。今すぐ行くよ。 – 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; 

はコンパイルが、あなたならば(親仕様で子供を覚えておくことはOKですパラメータをFにするのと同じように)、子どもが親を最初に存在させる必要があるため、循環依存を取得します。

したがって、それは本当にあなたがこれはあなたの問題への実際のソリューションであるかどうかを親両方にパブリックになりたいものをに依存します。

+0

私は本当に別のファイルで子パッケージを持っている必要があり、それが含まれているものは、親パッケージで使用するために透過的でなければなりません。だから、私は子パッケージを持つソリューションを探しています:宣言を含むことができ、別のファイルに入れることができます。型の宣言と 'separate'を使うことはできません。だから私はまだ同じ問題があります:私は型宣言を分離する必要があります。 –

+0

@JulioGuerra型宣言をparent.child heirachyのどこかに置く必要がありますか?そうでない場合は、型宣言をparent_types.adsに入れ、このファイルをparent.ads&parent.child.adsに入れてみましょう。 – NWS

+0

これは可能ではありません: "' 'with''はコンテクスト句にしか現れません"、これはパッケージ外です。 –

1

フリオ、specファイルで宣言されたタイプ(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; 

...

package Parent.Child is 

    procedure Eat (F : in Mytypes.Fruit); 

end Parent.Child; 

...

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

あなたは完全な例を書く必要はありませんでした:)したがって、コンパイル単位であるパッケージに型を入れます。はい、それは動作しますが、意味/論理的な問題があります。これらのタイプは親パッケージに属しており、論理はこれまで可能ではない(分離している) –

関連する問題