in out Airplanes; Data: in
type Airplane_Data is ... end record;
type Airplanes is
record
Database: array( 1.. 1000) of Airplane_Data;
Current_Airplanes: Integer O..Database'Last;
end record;
procedure New_Airplane(
A: in out Airplanes; Data: in Airplane_Data: I: out Integer);
procedure Get_Airplane(
A: in out Airplanes; I: in Integer; Data: out Airplane_Data);
end Airplane_Package;
Тело пакета такое же, как и раньше, за исключением того что в нем нет никаких глобальных переменных:
package body Airplane_Package is
function Find_Empty_Entry... ;
procedure New_Airplane...;
procedure Get_Airplane...;
end Airplane_Package;
Программа, которая использует пакет, может теперь объявить одну или несколько переменных типа, поставляемого пакетом. Фактически тип является обычным типом и может использоваться в последующих определениях типов и как тип параметра:
with Airplane_Package;
procedure Air_Traffic_Control is
Airplane: Airplane_Package.Airplanes;
-- Переменная ADT
type Ptr is access Airplane_Package.Airplanes;
-- Тип с компонентом ADT
procedure Display(Parm: in Airplane_Package.Airplanes);
-- Параметр ADT
A: Airplane_Package.Airplane_Data;
Index: Integer;
begin
A .:=... ;
Airplane_Package.New_Airplane(Airplane, A, Index);
Display(Airplane);
end Air_Traffic_Control;
За использование ADT вместо абстрактных объектов данных придется заплатить определенную цену: так как в теле пакета больше нет ни одного неявного объекта, каждая интерфейсная процедура должна содержать дополнительный параметр, который явно сообщает подпрограмме, какой именно объект нужно обработать.
Вы можете спросить: а как насчет «абстракции»? Поскольку тип Airplaines теперь объявлен в спецификации пакета, мы потеряли все абстракции; больше нельзя изменить структуру данных, не повлияв на другие единицы, использующие пакет.