如果 Main_Pkg 和 Second_Pkg 密切相关,以至于您将让其中一个包访问另一个包中定义的内容,那么将它们完全分开的通用包可能不是组织它们的正确方法。考虑让他们成为其他包的孩子。
听起来你有类似的东西
generic
type T is private;
package Main_Pkg is ... end Main_Pkg;
generic
type T is private;
package Second_Pkg is ... end Second_Pkg;
请注意,这并没有设置 Main_Pkg 和 Second_Pkg 必须使用相同类型的 T 实例化的规则。如果您的程序说类似
package Main_Inst is new Main_Pkg (T => T1);
package Second_Inst is new Second_Pkg (T => T2); -- some different type
那么显然 Second_Inst 和 Main_Inst 不能真正相互通信(使用泛型类型 T)。用相同的类型实例化它们不会神奇地导致两个实例之间的连接,而这两个实例之前不存在连接。
所以这两个泛型之间必须有某种联系。通用的正式包是一种可能性,西蒙介绍它的方式。另一种可能性是 Second_Pkg 有一个通用的正式包参数,它是 Main_Pkg 的一个实例:
generic
with package With_Main_Pkg is new Main_Pkg (<>);
package Second_Pkg is ...
现在 Second_Pkg 可以引用 With_Main_Pkg (它可以With_Main_Pkg.T
用来获取 Main_Pkg 的正式类型)。
但是将 Main_Pkg 和 Second_Pkg 放在某个更大的包中可能是最简单的,并且将 T 作为该更大包的参数而不是 Main_Pkg 和 Second_Pkg。
generic
type T is private;
package Larger_Pkg is
package Object_Inst is new Object_Pkg (T);
-- this might belong in Larger_Pkg's body, instead of the specification.
-- The bodies of Main_Pkg and Second_Pkg would both have it available.
package Main_Pkg is ...
package Second_Pkg is ...
end Larger_Pkg;
也许 Main_Pkg 和 Second_Pkg 也需要通用,如果它们需要除 T 之外的一些其他通用参数;我不知道。此解决方案不允许您将 Main_Pkg 和 Second_Pkg 的规格放在单独的单元中;您必须将它们嵌套在 Larger_Pkg 中。但是您仍然可以使用单独的编译 ( package body Main_Pkg is separate;
) 将主体分开。如果 Main_Pkg 和 Second_Pkg 可以是泛型,您可以将它们设为子单元:
generic
package Larger_Pkg.Main_Pkg is ...
end Larger_Pkg.Main_Pkg;
但是 Object_Inst 不能在 Larger_Pkg 的主体中。不过,它可能在私人部分。
无论如何,最好的答案部分取决于这些包应该在你的实际程序中代表什么概念。