0

我正在编写一个通用库。我有一个受保护的对象,需要通过两个包中的代码访问。包含对象的包和需要访问它的包都是通用的。我会打电话给包,Main_Pkg为了清楚起见。所有三个包都使用相同的类型进行实例化。Second_PkgObject_Pkg

对于非通用代码,我会简单地Object_PkgMain_Pkgand中“使用” Second_Pkg。我知道我不能用通用包做到这一点,因为Object_Pkg不会被实例化。

到目前为止,我已经尝试Main_Pkg创建一个实例Object_Pkg

package Instance_Of_Object_Pkg is new Object_Pkg(Custom_Type)

Second_Pkg使用类似的代码访问它

Main_Pkg.Instance_Of_Object_Pkg.Object.Procedure

但我得到一个编译器错误

invalid prefix in selected component "Main_Pkg"

这是我第一次使用泛型类型,所以我不确定是什么导致了问题或接下来要尝试什么。是否有可能做到这一点,如果可以,怎么做?

4

2 回答 2

4

我认为您可以使用通用的正式包

不打扰受保护的对象(能够访问任何东西应该证明这一点)之类的

generic
   type T is private;
package Object_Pkg is
   Arr : array (1 .. 10) of T;
end Object_Pkg;

然后指定Main_Pkg要使用类型T和具有Object_Pkg相同类型的实例化的实例化,如下所示:

with Object_Pkg;
generic
   type T is private;
   with package Inst is new Object_Pkg (T);
package Main_Pkg is
   Obj : T := Inst.Arr (1);
end Main_Pkg;

现在,首先实例化Object_Pkg

with Object_Pkg;
package Object_Inst is new Object_Pkg (T => Integer);

然后Main_Pkg用相同的类型和新的实例实例化Object_Pkg

with Object_Inst;
with Main_Pkg;
package Main_Inst is new Main_Pkg (T => Integer,
                                   Inst => Object_Inst);
于 2013-07-28T14:58:12.417 回答
0

如果 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 的主体中。不过,它可能在私人部分。

无论如何,最好的答案部分取决于这些包应该在你的实际程序中代表什么概念。

于 2013-07-29T15:59:14.230 回答