Ада защищенных типов - PullRequest
       17

Ада защищенных типов

1 голос
/ 21 февраля 2012

У меня в Аде есть простой пакет с процедурами и функциями. Я хотел бы иметь все функции и процедуры в защищенном виде.

например. для простого файла .adb

package body Pack is

  procedure procedure1 (B : in out Integer) is
  begin
    B := new Integer;
  end procedure1;

  procedure procedure2 (B: in out Integer) is
  begin
    B.Cont(B.First-1) := 1;
  end procedure2;

  function procedure3 (B : Integer) return Boolean is
  begin
    return B.First = B.Last;
  end procedure3;

end pack;

и / или простой .ads

package body Pack is

   procedure procedure1 (B : in out Integer);

   procedure procedure2 (B: in out Integer);

   function procedure3 (B : Integer) return Boolean;

end pack;

Как мне это сделать?

1 Ответ

6 голосов
/ 21 февраля 2012

Особенность защищенного типа в том, что он защищает что-то (от одновременного доступа).По вашему коду трудно понять, что именно вы хотите защитить.

Если, скажем, вы хотите сделать потокобезопасное приращение, вы можете иметь спецификацию, такую ​​как

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 для защищенных типов.

...