Ada:私有子包和父包元素的可见性

Ada: private child packages and visibility of elements from parent packages

具有以下包层次结构:

limited private with Root.Child;

package Root is
  
  type Root_t is tagged private;

  procedure p_dispatcher (this : in out Root_t);

private

  type ChildWideAcc_t is access Root.Child.Child_t;
  
  type Root_t is tagged 
    record
      ref : ChildWideAcc_t;
    end record;

end Root;
private package Root.Child is

  type Child_t is abstract tagged private;

  procedure p_opExample (
    this    : in out Child_t;
    Context : in out Root.Root_t
  );

private

  type Child_t is abstract tagged null record;

end Root.Child;

我知道子包自动是父规范,私有子包也是私有部分,但如果我不在子包上写任何“使用”声明,我也可以写“Root_t”过程“p_opExample”的“上下文”参数类型和我的程序运行完全一样,像这样:

  procedure p_opExample (
    this    : in out Child_t;
    Context : in out Root_t
  );

这种行为可以吗?为什么?

从 Ada83 开始,就可以在包定义中嵌套包定义。嵌套包结构的一个例子是包 Ada.Text_IO.

Ada95 引入了定义子包的功能,子包在逻辑上与嵌套包相同,但与父包在单独的文件中编写。由于它们在逻辑上是相同的,因此子包的 public 部分在逻辑上嵌套在其父包的 public 部分中,并且对 public 部分中声明的所有实体具有直接可见性父包。子包的私有部分在逻辑上嵌套在父包的私有部分中,并且对在父包的 public 和私有部分中声明或定义的所有实体具有直接可见性。子包体在逻辑上嵌套在父包体中,对父包public区域、父包私有区域和父包体中定义的所有实体具有直接可见性。

因此没有必要将父包名称附加到在父包中定义并在该父包的子包中使用的实体。

父包和子包的共享可见性不像通过使用上下文子句(with 和use)获得的可见性。上下文子句仅提供包的 public 部分的可见性。