父子關係
作為細分 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
型別的物件,然後呼叫 Add
,How_Much
和 Pay
。但是,它並沒有看到 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_Home
是 Orders
的兒童套餐。型別 Ordered_By_Phone
源自 Bill
,包括其記錄元件 Sum
。