我有一个通用的包装Containers.Stacks
看起来大致是阿达通用包扩展
generic
type Value_Type is private;
package Containers.Stacks with Preelaborate is
--Node stuff
type Stack is new Container with private;
--Other Stack stuff
--Private stuff
end Containers.Stacks;
一切有关的(似乎)工作得很好。我想重用这个实现来创建一个扩展但更窄的目的栈。我想出了以下内容:
问题的关键是,我不希望有重新实现所有公共堆栈的东西,只为特定整数堆栈。这是有效的,但留下了一个丑陋而奇怪的Containers.Integer_Stacks.Stack
和Containers.Integer_Stacks.Stacks.Stack
,我想避免它。然而,试图将包初始化放在私有部分中,也隐藏了所有的子例程。有没有办法做到我想做的事,或者说用户必须要处理的兄弟包初始化存在一个更合适的方法?
替代做法: 我发现这是可能的定义的Containers.Stacks
子包称为Containers.Stacks.Integer
像这样:
generic
with function "+"(Left, Right: Value_type) return Value_Type is <>;
package Containers.Stacks.Integer is
procedure Add(Self : in out Stack);
end Containers.Stacks.Integer;
而这个工作。除了现在我不能拨打Stack.Add
,我不得不打电话给Add(Stack)
。
“试图将包初始化private部分,但是,也隐藏了所有的子程序。” –
是的。这就是完成这一点的原因,正如你写的那样,你想创建一个“狭义目标堆栈”。您仍然可以从“Containers.Stacks.Stack”中为您的“窄目标栈”制作公开版本的操作。 –