Особенность защищенного типа в том, что он защищает что-то (от одновременного доступа).По вашему коду трудно понять, что именно вы хотите защитить.
Если, скажем, вы хотите сделать потокобезопасное приращение, вы можете иметь спецификацию, такую как
package Pack is
protected type T is
procedure Set (To : Integer);
procedure Increment (By : Integer);
function Get return Integer;
private
Value : Integer := 0;
end T;
end Pack;
(это далеко не идеально; вы хотели бы иметь возможность указать начальный Value
, когда объявляете T
, но это начинает усложняться).
В этом случае нужнобыть защищенным является Value
.Вы хотите быть уверены, что если две задачи вызовут Increment
в одно и то же время, одну с By => 3
и одну с By => 4
, Value
в конечном итоге будет увеличен на 7.
тело может выглядеть как
package body Pack is
protected body T is
procedure Set (To : Integer) is
begin
Value := To;
end Set;
procedure Increment (By : Integer) is
begin
Value := Value + By;
end Increment;
function Get return Integer is
begin
return Value;
end Get;
end T;
end Pack;
Рекомендуемое чтение: раздел Wikibooks для защищенных типов.