Ähnlich wie bei Tasks ist auch hier die Möglichkeit vorhanden, geschützte Objekte durch Diskriminanten zu parametrieren.
Wir geben als ein Beispiel eine geschützte Warteschlange. Angenommen wir haben ein Warteschlangenprotokoll wie folgt gegeben:
type Queue is abstract tagged null record;
Eine allgemeine geschützte Warteschlange kann nun wie folgt realisiert werden:
protected type PQ(Q: access Queue'CLASS) is
entry Put(X: in Queue_Data);
entry Get(X: out Queue_Data);
end;
protected body PQ is
entry Put(X: in Queue_Data) when not Is_Full(Q.all) is
begin
Add_To_Queue(Q,X);
end Put;
entry Get(X: out Queue_Data) when not Is_Empty(Q.all) is
begin
Remove_From_Queue(Q,X);
end Get;
end PQ;
Ein Benutzer kann nun seine eigene Queue implementieren, zum Beispiel durch
type My_Queue is new Queue with private;
function Is_Empty(Q: My_Queue) return boolean;
Raw_Queue: aliased My_Queue;
My_Protected_Queue: PQ(Raw_Queue'ACCESS);
My_Protected_Queue.Put(An_Item);