Ada: Zrozumienie prywatnych typów i zrozumienie opakowania

Próbuję nauczyć się korzystać z prywatnych deklaracji w Adzie, a także zrozumieć opakowanie. Starałem się, aby moje kody były jak najkrótsze.

Zaczynamy od głównego plikurectangular_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>

To mówi nam, że możemydwa wdrożenia i to na razieRectangular_Method_1 został wybrany.

Następnie mamy plik specyfikacjiRectangular_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>

i jego ciałoRectangular_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>

i wreszcie skrypt testowy: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>

Pytanie (dotyczytest_rectangular_form.adb):

Dostaję komponentyA.Horz iA.Vert bezpośrednio przy użyciu

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

i dostęp do komponentów poziomych i pionowych później, po prostu używając

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

i

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

Wydaje mi się, że korzystam z tych metodGet_Horz iGet_Vert aby uzyskać dostęp doprywatny Prostokątny poziome i pionowe elementy. Czytam jednak zmiennąTheta bezpośrednio z wiersza poleceń i znajdowanie jego poziomych i pionowych komponentów za pomocą

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

JeśliProstokątny składnikiA.Horz iA.Vert są prywatne, tak jak je zdefiniowałem,dlaczego nie muszę korzystać z metodset_Horz(A) iset_Vert(A) wcześniejszy do wydania polecenia

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

PS: Funkcje dlaSet_Vert iGet_Vert zostały pominięte, aby zachować krótkie kody.

Wielkie dzięki...

questionAnswers(1)

yourAnswerToTheQuestion