Ада-95. Компилятор GNAT
66ac8edd

Многоуровневые абстракции


При построении новой абстракции из другой абстракции, новая абстракция может нуждаться в доступе к приватным описаниям уже существующей абстракции.

Например, повсеместные "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;

Следует заметить, что в подобных случаях, иерархия модулей, как правило, параллельна иерархии абстракций представленных в этих модулях.



Содержание раздела