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

Построение абстракции путем композиции


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

В таком случае, новый тип данных описывается как запись (или тэговая запись) полями которой являются уже существующие типы данных.

Функциональность нового типа данных обеспечивается путем перенаправления вызовов подпрограмм к соответствующим компонентам этого типа.

Рассмотрим следующий пример:

with Lists; use Lists;

package Queues is

type Queue is private;

procedure Remove_From_Head(Item : in out Queue; Value : out Integer); procedure Add_To_Tail(Item : in out Queue; Value : Integer);

function Full(Item : Queue) return Boolean; function Empty(Item : Queue) return Boolean;

function Init return Queue;

private

-- очередь состоит из следующих элементов:



type Queue is record

Values : List; No_Of_Elements : Integer; end record; end Queues;

package body Queues is

procedure Remove_From_Head(Item : in out Queue; Value : out Integer) is

begin

Remove_From_Head(Item.Values, Value); Item.No_Of_Elements := Item.No_Of_Elements - 1; end Remove_From_Head;

procedure Add_To_Tail(Item : in out Queue; Value : Integer) is

begin

Add_To_Tail(Item.Values, Value); Item.No_Of_Elements := Item.No_Of_Elements + 1; end Add_To_Tail;

procedure Reset (Item : in out Queue) is ...

function Full(Item : Queue) return Boolean is

begin

return Full(Item.Values); end Full;

function Empty(Item : Queue) return Boolean is

begin

return Item.No_Of_Elements = 0; end Empty;

end Queues;

В этом примере вызовы подпрограмм, обращенные к типу очереди Queue, будут "перенаправлены" к компоненту список (List), на который возлагается ответственность за реализацию некоторых аспектов абстракции очереди (в данном случае - это основная часть).



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