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;

子パッケージを使用することは不可能だと思うので、これを行う別の方法があるかもしれません...

4

3 に答える 3

1

Julio、仕様ファイル (mytypes.ads) で宣言された型

package Mytypes is

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

end Mytypes;

...他のいくつかでそれを使いました:

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

これはあなたが試したものですか?

于 2012-05-10T14:34:15.330 に答える
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;

コンパイルしても問題ありませんが、親仕様で子を使用する場合 (パラメーター to を使用する場合と同様F)、子は親が最初に存在することを要求するため、循環依存関係が発生することを覚えておいてください!

したがって、これが問題の実際の解決策であるかどうかは、親と子の両方にを公開したいかによって異なります。

于 2012-05-08T07:38:56.540 に答える
1

一般的に、いいえ。2 番目の例が機能するのは、が で宣言されているときにの仕様Childがわかっているからです。このトピックに関する以前の質問に照らして、共通の仕様の複数の実装を分離する明確な方法が必要な場合があります。この関連するQ&Aでは、継承を使用する方法と、コンパイル時にライブラリ ベースのメカニズムを使用する方法の 2 つの方法について説明しています。FParent

于 2012-05-07T11:09:34.710 に答える