Ada: Private Typen verstehen und Verpackung verstehen

Ich versuche zu lernen, wie man private Deklarationen in Ada verwendet und wie man Verpackungen versteht. Ich habe versucht, meine Codes so kurz wie möglich zu halten.

Wir beginnen mit der Hauptdateirectangular_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>

Dies sagt uns, dass wir haben könnenzwei Implementierungen und das fürs ErsteRectangular_Method_1 wurde ausgewählt.

Dann haben wir die SpezifikationsdateiRectangular_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>

und sein KörperRectangular_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>

und zum Schluss das Testskript: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>

Frage (angewendet auftest_rectangular_form.adb):

Ich bekomme die KomponentenA.Horz undA.Vert direkt mit

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

und später einfach mit auf die horizontalen und vertikalen Komponenten zugreifen

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

und

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

Dies scheint in Ordnung zu sein, da ich die Methoden verwendeGet_Horz undGet_Vert Zugang zumPrivatgelände Rechteckig horizontale und vertikale Komponenten. Ich lese jedoch die VariableTheta direkt von der Kommandozeile und finden Sie seine horizontalen und vertikalen Komponenten mit

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

Wenn dasRechteckig KomponentenA.Horz undA.Vert sind privat, wie ich sie definiert habe,warum muss ich die methoden nicht anwendenset_Horz(A) undset_Vert(A) vor zum Ausgeben des Befehls

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

PS: Die Funktionen fürSet_Vert undGet_Vert wurden weggelassen, um die Codes kurz zu halten.

Danke vielmals...

Antworten auf die Frage(1)

Ihre Antwort auf die Frage