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...