父子关系

作为细分 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