我在Ada中有一个包含程序和功能的简单包。我想把所有的功能和程序都放在受保护的类型中。
e.g。对于一个简单的.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;
我该怎么做呢?
答案 0 :(得分:6)
关于受保护类型的事情是它保护某些东西(防止并发访问)。从你的代码中很难看出你想保护什么。
如果您想要进行线程安全增量,那么您可能有一个类似
的规范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 section。