阿达:了解私有类型和了解包装(Ada: Understanding private types an

2019-06-25 07:58发布

我想学习如何在阿达使用私有声明,也了解包装。 我试图让我的代码尽可能短。

我们先从主文件rectangular_Form.ads

with Rectangular_Method_1;
package Rectangular_Form renames Rectangular_Method_1;
-- with Rectangular_Method_2;
-- package Rectangular_Form renames Rectangular_Method_2;

这就告诉我们,我们可以有两种实现方式,并且现在Rectangular_Method_1已被选定。

然后我们有规范文件Rectangular_Method_1.ads

package Rectangular_Method_1 is
   type Rectangular is private;

   procedure Vector_Basis_r (A : in Long_Float; D : out Rectangular);
   procedure Set_Horz (R : in out Rectangular; H : Long_Float);
   function Get_Horz (R : Rectangular) return Long_Float;

 private
   type Rectangular is
        record
             Horz, Vert: Long_Float;
        end record;
end Rectangular_Method_1;

它的机身Rectangular_Method_1.adb

with Ada.Numerics.Long_Elementary_Functions;
use  Ada.Numerics.Long_Elementary_Functions;

package body Rectangular_Method_1 is
procedure Vector_Basis_r (A : in Long_Float; D : out Rectangular) is
begin
  D.Horz := Cos (A, Cycle => 360.0);
  D.Vert := Sin (A, Cycle => 360.0);
end Vector_Basis_r;

procedure Set_Horz (R : in out Rectangular; H : Long_Float) is
begin
  R.Horz := H;
end Set_Horz;

function Get_Horz (R : Rectangular) return Long_Float is
begin
  return R.Horz;
end Get_Horz;

end Rectangular_Method_1;

最后的测试脚本: test_rectangular_form.adb

with Ada.Long_Float_Text_IO;
with Ada.Text_IO; use Ada.Text_IO;
with Rectangular_Form;
use type Rectangular_Form.Rectangular;

procedure Test_Rectangular_Form is
Component_Horz, Component_Vert, Theta  : Long_Float;
Basis_r                                : Rectangular_Form.Rectangular;

begin
  Ada.Text_IO.Put("Enter the angle ");
  Ada.Long_Float_Text_IO.Get (Item => theta);

  --Vector basis
  Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);
  Ada.Text_IO.New_Line;

  Ada.Text_IO.Put("rhat_min_theta = ");
  Ada.Long_Float_Text_IO.Put (Item => Rectangular_Form.Get_Horz (Basis_r), Fore => 3, Aft  => 5, Exp  => 0);
  Ada.Text_IO.Put(" ihat + ");
  Ada.Long_Float_Text_IO.Put (Item => Rectangular_Form.Get_Vert (Basis_r), Fore => 3, Aft  => 5, Exp  => 0);
  Ada.Text_IO.Put (" jhat ");
end Test_Rectangular_Form;

问题(适用于test_rectangular_form.adb ):

我得到的组件A.HorzA.Vert直接使用

    Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);

并通过只使用访问以后的水平和垂直分量

    Rectangular_Form.Get_Horz (Basis_r)

    Rectangular_Form.Get_Vert (Basis_r)

这似乎OK,因为我现在用的方法Get_HorzGet_Vert访问私有 矩形水平和垂直分量。 但是我读可变Theta直接从命令行并且使用查找其水平和垂直分量

    Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);

如果矩形部件A.HorzA.Vert是私有的,因为我已经定义了他们, 为什么我不必须使用方法set_Horz(A)set_Vert(A)发出命令之前

    Rectangular_Form.Vector_Basis_r (A => Theta, D => Basis_r);

PS:对于功能Set_VertGet_Vert被省略,以保持代码的短。

非常感谢...

Answer 1:

为什么我不必须使用发出命令之前,方法set_Horz(A)和set_Vert(A)

因为你通过执行设置您的私人记录的字段:

Rectangular_Form.Vector_Basis_r(A =>西塔,d => Basis_r);

(查看Vector_Basis_r的实施。)

- 扩展答案

当您Test_Rectangular_Form过程中声明的变量Basis_r,对于“矩形”变量分配内存。 此时在私有类型的水平对齐和韦尔领域都存在,但是未设置(它们可以包含任何内容)。

当你调用Rectangular_Form.Vector_Basis_r,它的实施将这些私有字段的值。 也许这是何等的混乱您: 在一个私有类型声明的封装中的身体有这些领域的直接访问 。 这正是设定它们的值(以及Set_Vert和Set_Horz)时Vector_Basis_r正在利用的方面。



文章来源: Ada: Understanding private types and understanding packaging