父子關係

作為細分 Ada 程式的一種方式,包可能有所謂的孩子。這些也可以是包裝。子包具有特殊許可權:它可以在父包的私有部分中看到宣告。這種特殊可見性的一個典型用途是在物件導向程式設計中形成派生型別的層次結構。

package Orders is
   type Fruit is (Banana, Orange, Pear);
   type Money is delta 0.01 digits 6;
   
   type Bill is tagged private;

   procedure Add
     (Slip   : in out Bill;
      Kind   : in     Fruit;
      Amount : in     Natural);
   
   function How_Much (Slip : Bill) return Money;
   
   procedure Pay
     (Ordered : in out Bill;
      Giving  : in     Money);
   
private
   type Bill is tagged record
      --  ...
      Sum : Money := 0.0;
   end record;
end Orders;

任何以 with Orders; 為首的 Ada 單位都可以宣告 Bill 型別的物件,然後呼叫 AddHow_MuchPay。但是,它並沒有看到 Bill 的組成部分,甚至也沒有看到 Orders.Bill 的組成部分,因為完整的型別定義隱藏在 Orders私有部分中。但是,完整定義不是從子包中隱藏的。如果需要,此可見性便於型別擴充套件。如果在子包中宣告型別是從 Bill 派生的,那麼這個繼承型別可以直接操作 Bill 的元件。

package Orders.From_Home is
   type Address is new String (1 .. 120);
   
   type Ordered_By_Phone is new Bill with private;
   
   procedure Deliver
     (Ordered : in out Ordered_By_Phone;
      Place   : in     Address);

private
   type Ordered_By_Phone is new Bill with
      record
         Delivered : Boolean := False;
         To        : Address;
      end record;
end Orders.From_Home;

Orders.From_HomeOrders 的兒童套餐。型別 Ordered_By_Phone 源自 Bill,包括其記錄元件 Sum