Ada: Entender los tipos privados y entender el empaquetado

Estoy intentando aprender a usar declaraciones privadas en Ada y también a entender el empaquetado. He tratado de mantener mis códigos lo más cortos posible.

Comenzamos con el archivo principal.rectangular_Form.ads

<code>with Rectangular_Method_1;
package Rectangular_Form renames Rectangular_Method_1;
-- with Rectangular_Method_2;
-- package Rectangular_Form renames Rectangular_Method_2;
</code>

Esto nos dice que podemos tenerdos implementaciones y que por ahoraRectangular_Method_1 ha sido elegida.

Luego tenemos el archivo de especificacionesRectangular_Method_1.ads:

<code>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;
</code>

y su cuerpoRectangular_Method_1.adb:

<code>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;
</code>

y finalmente el guión de prueba:test_rectangular_form.adb:

<code>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;
</code>

Pregunta (aplicada atest_rectangular_form.adb):

Estoy consiguiendo los componentesA.Horz yA.Vert usando directamente

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

y acceder a los componentes horizontales y verticales más adelante con solo usar

<code>    Rectangular_Form.Get_Horz (Basis_r)
</code>

y

<code>    Rectangular_Form.Get_Vert (Basis_r)
</code>

Esto parece bien ya que estoy usando los métodos.Get_Horz yGet_Vert para acceder a laprivado Rectangular Componentes horizontales y verticales. Sin embargo estoy leyendo la variableTheta directamente desde la línea de comando y encontrando sus componentes horizontales y verticales usando

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

Si elRectangular componentesA.Horz yA.Vert son privados como los he definido,¿Por qué no tengo que usar los métodos?set_Horz(A) yset_Vert(A) anterior a emitir el comando

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

PS: Las funciones paraSet_Vert yGet_Vert Se omitieron para mantener los códigos cortos.

Muchas gracias...

Respuestas a la pregunta(1)

Su respuesta a la pregunta