我有一个通用包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;
看起来一切都运行正常。我想重复使用此实现以创建一个扩展但更窄的目的堆栈。我想出了以下内容:
with Containers.Stacks;
generic
type Value_Type is range <>;
package Containers.Integer_Stacks with Preelaborate is
package Stacks is new Containers.Stacks(Value_Type);
use Stacks;
type Stack is new Stacks.Stack with null record;
procedure Add(Self : in out Stack);
procedure Subtract(Self : in out Stack);
--So on
end Containers.Integer_Stacks;
重点是,我不想重新实现所有常见的栈操作,只为特定的整数栈。这个方法可以工作,但会留下一个丑陋而奇怪的混乱部分:Containers.Integer_Stacks.Stack
和 Containers.Integer_Stacks.Stacks.Stack
,我想避免这种情况。然而,试图将包初始化放在私有部分中也会隐藏所有子例程。是否有更适当的方法来完成我所要做的事情,还是用户必须处理存在兄弟包初始化的情况?
替代方法:
我发现可以定义一个名为Containers.Stacks.Integer
的Containers.Stacks
子包,如下所示:
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)
。
Containers.Stacks.Stack
中公开使用你需要的操作的公共版本,以满足你的“狭窄目的堆栈”的需求。 - Jacob Sparre Andersen