Многоуровневые абстракции
При построении новой абстракции из другой абстракции, новая абстракция может нуждаться в доступе к приватным описаниям уже существующей абстракции.
Например, повсеместные "widgets", использующиеся для программирования в X Window System, имеют спецификации (такие как "labels"), которые зависят от их реализации в приватном представлении "widgets".
Описание абстрактного типа данных Widget_Type
для X Window System может иметь следующий вид:
with X_Defs; use X_Defs; package Xtk is
type Widget_Type is tagged private; procedure Show (W : in Widget_Type); private type Widget_Ref is access all Widget_Type'Class; type Widget_Type is record Parent : Widget_Ref; Class_Name : X_String; X, Y : X_Position; Width, Height : X_Dimension; Content : X_Bitmap; end record; end Xtk; |
В данном случае, построение абстракции Label_Type поверх Widget_Type
удобно осуществить с помощью создания дочернего модуля Xtk.Labels, который может выглядеть следующим образом:
with X_Defs; use X_Defs; package Xtk.Labels is
type Label_Type is new Widget_Type with private; procedure Show (L : in Label_Type); -- необходим доступ к приватным описаниям Xtk (например, позиция label) private type Label_Type is new Widget_Type with record Label : X_String; Color : X_Color_Type; end record; end Xtk.Labels; |
Следует заметить, что в подобных случаях, иерархия модулей, как правило, параллельна иерархии абстракций представленных в этих модулях.