You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ada中实现类似C#的get/set访问器以兼容原有代码?

在Ada中实现类似C#的get/set访问器,兼容原有Value属性

刚好做过类似的需求!Ada里虽然没有像C#那样原生的属性语法,但我们可以通过两种方式实现你的需求:既拆分内部存储为ten和unit,又保留原有Value的读写语法,同时支持新增的直接读取ten/unit的能力。

方案一:Ada 2012+(推荐,最接近C#体验)

如果你的编译器支持Ada 2012或更高版本,可以利用**属性子程序(Property Subprograms)**来模拟C#的get/set,让Value看起来完全像记录的成员,但实际读写时会触发我们定义的计算逻辑。

包规范定义

package My_Type_Package is
   type MyType is record
      Ten : Integer := 0;
      Unit : Integer := 0;
   end record with
      -- 定义Value的getter:读取时计算返回值
      function Value (Obj : MyType) return Integer is (Obj.Ten * 10 + Obj.Unit),
      -- 定义Value的setter:赋值时拆分到ten和unit
      procedure Set_Value (Obj : in out MyType; New_Value : Integer) is
      begin
         Obj.Unit := New_Value mod 10;
         Obj.Ten := New_Value / 10;
      end Set_Value;

   -- 为了支持直接用`Obj.Value`和`Obj.Value := X`的语法,导出属性子程序
   function Value (Obj : MyType) return Integer renames MyType.Value;
   procedure Set_Value (Obj : in out MyType; New_Value : Integer) renames MyType.Set_Value;

   -- 兼容原有聚合初始化语法`MyType'(Value => 15)`的构造函数
   function Create_From_Value (Value : Integer) return MyType is
      Result : MyType;
   begin
      Set_Value(Result, Value);
      return Result;
   end Create_From_Value;
end My_Type_Package;

使用示例

with My_Type_Package; use My_Type_Package;

procedure Main is
   -- 替代原有聚合语法,初始化Value为15
   var : MyType := Create_From_Value(15);
begin
   -- 保持原有修改方式:直接给Value赋值
   var.Value := 65;

   -- 新增的读取方式:直接访问内部的ten和unit
   declare
      ten_val : Integer := var.Ten;   -- 这里会得到6
      unit_val : Integer := var.Unit; -- 这里会得到5
      current_value : Integer := var.Value; -- 这里会得到65(通过getter计算)
   begin
      null;
   end;
end Main;

方案二:兼容旧版本Ada(无属性子程序支持)

如果你的环境只能用Ada 2005或更早版本,我们可以用传统的函数+过程来模拟get/set,虽然语法稍微繁琐一点,但同样能实现需求。

包规范定义

package My_Type_Package is
   type MyType is private;

   -- Getter:模拟Value的读取
   function Get_Value (Obj : MyType) return Integer;
   -- 别名简化语法,让调用更接近属性
   function Value (Obj : MyType) return Integer renames Get_Value;

   -- Setter:模拟Value的赋值
   procedure Set_Value (Obj : in out MyType; New_Value : Integer);

   -- 构造函数:兼容原有聚合初始化逻辑
   function Create_MyType (Value : Integer) return MyType;

   -- 新增的ten和unit读取接口
   function Get_Ten (Obj : MyType) return Integer;
   function Get_Unit (Obj : MyType) return Integer;

private
   type MyType is record
      Ten : Integer := 0;
      Unit : Integer := 0;
   end record;
end My_Type_Package;

包体实现

package body My_Type_Package is
   function Get_Value (Obj : MyType) return Integer is
   begin
      return Obj.Ten * 10 + Obj.Unit;
   end Get_Value;

   procedure Set_Value (Obj : in out MyType; New_Value : Integer) is
   begin
      Obj.Unit := New_Value mod 10;
      Obj.Ten := New_Value / 10;
   end Set_Value;

   function Create_MyType (Value : Integer) return MyType is
      Result : MyType;
   begin
      Set_Value(Result, Value);
      return Result;
   end Create_MyType;

   function Get_Ten (Obj : MyType) return Integer is
   begin
      return Obj.Ten;
   end Get_Ten;

   function Get_Unit (Obj : MyType) return Integer is
   begin
      return Obj.Unit;
   end Get_Unit;
end My_Type_Package;

使用示例

with My_Type_Package; use My_Type_Package;

procedure Main is
   var : MyType := Create_MyType(15); -- 替代原有聚合初始化
begin
   Set_Value(var, 65); -- 替代原有`var.Value := 65`的赋值方式

   declare
      ten_val : Integer := Get_Ten(var);
      unit_val : Integer := Get_Unit(var);
      current_value : Integer := Value(var);
   begin
      null;
   end;
end Main;

关键说明

  • 对于原有代码中MyType'(Value => 15)的聚合初始化,我们用构造函数替代,这样不需要修改大量只读文件的引用逻辑。
  • Ada 2012+的方案可以让Value的读写语法和原有代码完全一致,几乎不需要修改原有业务代码;旧版本方案需要把赋值语句改成调用Set_Value,但读取逻辑可以用Value(var)替代原有var.Value。

内容的提问来源于stack exchange,提问作者A.Pissicat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:08:43