如何从Ada中的另一个包传递私有类型

时间:2016-04-16 18:19:41

标签: ada

假设我有一个类似以下的包:

package binary_search_tree is
    type pointer is limited private;

    procedure insert (item : pointer);
private
    type node;
    type pointer is access node;
end binary_search_tree;

现在假设我有一个想要像这样调用foo的驱动程序:

with binary_search_tree;

procedure main is
    package new_tree is new binary_search_tree;
begin
    new_binary_search_tree.insert(???);
end

所以我要做的是创建一个二叉搜索树包并在驱动程序中实现它。规范要求我在二叉树包中声明一个节点指针类型为有限私有,并且它希望我通过驱动程序将指针传递给二叉树的根到其函数中。但是,如果指针类型是私有的,我不知道如何做到这一点。除非我遗漏了什么,否则我认为我不应该这样做。这不违反封装吗?

1 个答案:

答案 0 :(得分:3)

您的pointer类型位于binary_search_tree的可见部分,因此任何实例化也都有pointer类型。它是limited private,因此您可以声明该类型的变量;您可以将它们传递给子程序(例如insert),您无法相互比较,复制它们或使用任何内容知识。

您的通用(没有任何实际细节,但可编辑)看起来像

generic
   type Element is private;
package Binary_Search_Tree is
   type Tree is limited private;

   procedure Insert (Into : in out Tree; Item : Element);
private
   type Node;
   type Tree is access Node;
   type Node is record
      --  pointer stuff
      Value : Element;
   end record;
end Binary_Search_Tree;

用户程序(你的意思是“驱动程序”?)看起来像

with Binary_Search_Tree;

procedure Main is
   package New_Tree is new Binary_Search_Tree (Integer);
   T : New_Tree.Tree;
begin
   New_Tree.Insert (T, 123);
end Main;