3

これは、私の以前の投稿のフォローアップです。

Ada: プライベート タイプとパッケージングの理解

型の実装はRectangular1 つの実装を使用して作成されました。つまり Rectangular_Method_1、この実装には仕様ファイルと本体ファイルが必要でした。

ユーザーが別の実装をRectangular_Method_2利用できるようにしたい場合は、メインファイル を次の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;

質問

  1. test_rectangular_form.adbこれは、テスト ファイルが別の実装でも同じままであるという点で、別の実装を可能にするソフトウェア エンジニアリングの正しい方法ですか?

  2. 2 つ目の実装を作成する場合Rectangular_Method_2、この新しい実装の必須の新しい本体に加えて、別の仕様ファイルを作成する必要はありますか? Vector_Basis_rただし、新しい実装でSet_Horz、などに同じプロシージャ/関数を提供して、Get_Horzそれらを で呼び出せるようにする必要がありtest_rectangular_form.adbます。

ありがとう...

4

2 に答える 2

3

これを行う別の方法は、タグ付きの型を使用することです。

package Rectangular is
   type Instance is abstract tagged private;

   procedure Vector_Basis_r (A : in Long_Float; D : out Instance);
   procedure Set_Horz (R : in out Instance; H : Long_Float);
   function Get_Horz (R : Instance) return Long_Float;
private
   type instance is tagged null record;
end Rectangular;

with Rectangular;
package Rectangular_Method_1 is
    type Instance is new Rectangular.Instance with private;
    ...
private
    type Instance is new Rectangular.Instance with 
    record
        Horz, Vert: Long_Float;
    end record;
end Rectangular_Method_1;

(Rectangular_Method_2 の同様の実装)。

次に、この方法でそれを使用するコードを記述できると思います。

with Rectangular_Method_1;
with Rectangular_Method_2;
...
--  My_Rectangle : Rectangular_Method_1.Instance;
My_Rectangle : Rectangular_Method_2.Instance;

My_Rectangle.Set_Horiz(Whatever_Value);
...

つまり、この 2 つを切り替えるときに変更する必要があるのは型名だけです。クライアントは、上部にある単一のサブタイプを使用することで、これらの変更を取り除くことさえできます。

subtype Rectangle_Instance is Rectangular_Method_2.Instance;

これにより、共通のコード/フィールドを基本クラス (パッケージ) に移動することもできます。

于 2012-05-02T13:18:04.450 に答える