等价于Ada中的访问器

等价于Ada中的访问器,ada,accessor,Ada,Accessor,有没有一种方法可以在Ada中创建与C#get/set等价的对象 我有这样一种类型(在Ada中): 我想像这样分割值 -- Ada : type MyType is record ten : Integer; unit : Integer; end record; 但是我想保留MyType.Value(在许多只读文件中引用)。我想创建一个访问器,但在Ada中找不到该怎么做。我知道怎么用C#: 我想做的是: -- ada : MyType var := MyType'(Valu

有没有一种方法可以在Ada中创建与C#get/set等价的对象

我有这样一种类型(在Ada中):

我想像这样分割值

-- Ada :
type MyType is record 
    ten  : Integer;
    unit : Integer;
end record;
但是我想保留
MyType.Value
(在许多只读文件中引用)。我想创建一个访问器,但在Ada中找不到该怎么做。我知道怎么用C#:

我想做的是:

-- ada :
MyType var := MyType'(Value => 15); -- unmodified code
var.Value := 65; -- can be modified like before

Integer ten := var.ten; -- new getter

正如我在对上一个问题的评论中所说的,没有任何语言结构能为你做到这一点。根据您的用例,您可能会使用受控类型:

type MyTypeView (Data : not null access MyType) is limited
  new Ada.Finalization.Limited_Controlled with record
   Value: Integer;
end record;

overriding procedure Initialize (Object : in out MyTypeView) is
begin
   Object.Value := Object.Data.ten * 10 + Object.Data.unit;
end Initialize;

overriding procedure Finalize (Object : in out MyTypeView) is
begin
   Object.Data.ten := Object.Value / 10;
   Object.Data.unit := Object.Value mod 10;
end Finalize;
这将允许您使用视图更改所需的值:

declare
   --  assuming MyObj is an object of type MyType
   View : MyTypeView (MyObj'Access);
   --  Initialize will be called, setting View.Value
begin
   --  can access value as "property"
   Do_Something (View.Value);
   --  can assign value as "property"
   View.Value := 123;
   --  when View goes out of scope, Finalize will be called, updating MyObj
end;

但是请注意,只要视图存在,View.Value就与原始对象分离,这意味着在
末尾,创建视图后对MyObj进行的其他修改将被丢弃。在单线程程序中,这意味着您可能不会调用任何子例程,这些子例程可能会在当前视图存在时实例化同一对象的视图(并且可能不会直接实例化块内该对象的第二个视图)。

这是一个专用类型的作业

package Hidden is
   type T is tagged private;

   function New_T (Value : Integer) return T;

   function Value (Tee : T) return Integer;
   function Ten   (Tee : T) return Integer;
   function Unit  (Tee : T) return Integer;
private -- Hidden
   type T is tagged record
      Ten  : Integer;
      Unit : Integer;
   end record;
   ...
end Hidden;
现在你可以写这样的东西了

V : T := New_T (42);
...
Put_Line (Item => V.Value'Image & V.Ten'Image & V.Unit'Image);
V := New_T (23);

谢谢你的回答。你以前的回答让我不安,但这是一个新问题。我编辑我的问题是为了更清楚(希望更好,我是ada的新手),正如我所说,没有语言特性直接支持您想要的。您总是可以使用
函数My_Value()返回V_Type
过程设置My_Value(Value:V_Type)
的方式,但是没有像C#中那样的特殊属性语法。我尝试了您的解决方案,它似乎可以工作,但当我使用
类型MyTypeArray is array时,出现了一个错误“数组声明中的无约束元素类型”MyTypeView的(MyRange)
不能在数组中使用
MyTypeView
,因为它有一个鉴别器。给鉴别器赋值会限制类型,数组需要受约束的内部类型。数组中的类型不能有不同的鉴别器。
package Hidden is
   type T is tagged private;

   function New_T (Value : Integer) return T;

   function Value (Tee : T) return Integer;
   function Ten   (Tee : T) return Integer;
   function Unit  (Tee : T) return Integer;
private -- Hidden
   type T is tagged record
      Ten  : Integer;
      Unit : Integer;
   end record;
   ...
end Hidden;
V : T := New_T (42);
...
Put_Line (Item => V.Value'Image & V.Ten'Image & V.Unit'Image);
V := New_T (23);