等价于Ada中的访问器
有没有一种方法可以在Ada中创建与C#get/set等价的对象 我有这样一种类型(在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 :
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);