阿达:包装概念[关闭](Ada: packaging concepts [closed])

2019-07-29 05:29发布

这是我在这里较早后的随访:

阿达:了解私有类型和了解包装

为实现Rectangular型使用一个实现即发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. 如果我们创建第二个实施Rectangular_Method_2 ,是否有必要建立另外一个单独的规范文件,以强制新的身体为这个新的实现? 然而有需要提供相同的过程/函数Vector_Basis_rSet_HorzGet_Horz等在新的实施,使我们可以称他们为test_rectangular_form.adb

谢谢...

Answer 1:

如果你使用GNAT,您可以使用GPR文件的项目。 在那里,您可以更改文件名的特定软件包,例如:

for Specification (Rectangular_Form) use "Rectangular_Method_1.ads";
for Implementation (Rectangular_Form) use "Rectangular_Method_1.adb";

你甚至可以设置这取决于环境变量。

如果你的规格文件都应该看起来是一样的,你可以使用一个Rectangular_Form.ads只有使用实现线从上面。

一个例子GPR文件看起来是这样的:

project Example is

   type Methods is ("normal", "something_else");
   Method : Methods := external ("METHOD", "normal");

   package Naming is
      case Method is
         when "normal" =>
            for Implementation ("Example") use "example_normal.adb";
         when "something_else" =>
            for Implementation ("Example") use "example_something.adb";
      end case;
   end Naming;

end Example;

然后,你可以使用gnatmake -P example.gpr它取决于你的编译METHOD变量,或使用-XMETHOD=...参数gnatmake或只使用提供的默认值。

example_*.adb都应该包含包的本体Example ,而不是Example_Normal等。



Answer 2:

另一种方式做,这是使用标签类型。

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

换句话说,你不得不改变时,两者之间的切换是类型名称。 您的客户甚至可以在顶部使用单一亚型摆脱这些变化。

subtype Rectangle_Instance is Rectangular_Method_2.Instance;

这也将让您移动通用代码/田成基类(包),我认为这是那种你是什么之后的能力。



文章来源: Ada: packaging concepts [closed]
标签: packaging ada