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