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



         

Абстракция очереди - часть 2


with Queues; use Queues;

procedure Break_Abstraction is

My_Q : Queue;

begin

Add_To_Head(My_Q, 5); Add_To_Tail(My_Q, 5);

-- очередь должна разрешать вставку в конец очереди -- и удаление из начала очереди, -- или наоборот

end Break_Abstraction;

Для решения подобной проблемы при создании абстракции очереди необходимо использовать абстракцию списка приватно:

with 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 new Lists.List;

end Queues;

package body Queues is

-- выполняем конверсию типов (из Queue в List), а затем, -- выполняем вызов соответствующей подпрограммы List

use Lists;

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

begin

Lists.Remove_From_Head(List(Item), Value); end Remove_From_Head;

-------------------------------------------------------------------- function Full(Item : Queue) return Boolean is

begin

return Lists.Full(List(Item)); end Full;

. . .

function Init return Queue is

begin

return Queue(Lists.Init); end Init;

end Queues;




Содержание  Назад  Вперед