这是我在这里较早后的随访:
阿达:了解私有类型和了解包装
为实现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;
问题
这是软件工程的正确方法,以允许在测试文件的另一个实施test_rectangular_form.adb
保持不变,为不同的实现?
如果我们创建第二个实施Rectangular_Method_2
,是否有必要建立另外一个单独的规范文件,以强制新的身体为这个新的实现? 然而有需要提供相同的过程/函数Vector_Basis_r
, Set_Horz
, Get_Horz
等在新的实施,使我们可以称他们为test_rectangular_form.adb
。
谢谢...
如果你使用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
等。
另一种方式做,这是使用标签类型。
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;
这也将让您移动通用代码/田成基类(包),我认为这是那种你是什么之后的能力。