Generics Ada通用包扩展

Generics Ada通用包扩展,generics,ada,Generics,Ada,我有一个通用的包Containers.Stacks,看起来大致像 通用 类型值\u类型为私有类型; 包装容器。与预加工材料堆放在一起 --节点材料 类型堆栈是具有私有属性的新容器; --其他堆叠的东西 --私人物品 末端容器。堆叠; 一切似乎都很好。我想重用这个实现来创建一个扩展但更窄的堆栈。我提出了以下建议: 使用容器。堆栈; 通用的 类型值\u类型为范围; 包装容器。整型_与预实验室堆叠为 包装堆叠是新的容器。堆叠(值_类型); 使用堆栈; 类型堆栈是新堆栈。堆栈记录为空; 程序添加(Se

我有一个通用的包
Containers.Stacks
,看起来大致像

通用
类型值\u类型为私有类型;
包装容器。与预加工材料堆放在一起
--节点材料
类型堆栈是具有私有属性的新容器;
--其他堆叠的东西
--私人物品
末端容器。堆叠;
一切似乎都很好。我想重用这个实现来创建一个扩展但更窄的堆栈。我提出了以下建议:

使用容器。堆栈;
通用的
类型值\u类型为范围;
包装容器。整型_与预实验室堆叠为
包装堆叠是新的容器。堆叠(值_类型);
使用堆栈;
类型堆栈是新堆栈。堆栈记录为空;
程序添加(Self:in-out-Stack);
程序减法(Self:in-out堆栈);
--诸如此类
end Containers.Integer_堆栈;

关键是,我不想重新实现所有常见的堆栈内容,只针对特定的整数堆栈。这是可行的,但却留下了一堆丑陋而奇怪的
容器.Integer\u Stacks.Stack
容器.Integer\u Stacks.Stacks.Stack
,这是我想要避免的。但是,尝试将包初始化放在private部分也会隐藏所有子例程。是否有一种更合适的方法来完成我试图做的事情,或者用户必须处理当前的兄弟包初始化

备选办法: 我发现可以定义一个子包
Containers.Stacks
,称为
Containers.Stacks.Integer
,如下所示:

通用
函数“+”(左、右:值类型)返回值类型为;
package Containers.Stacks.Integer为
程序添加(Self:in-out-Stack);
end Containers.Stacks.Integer;
这是有效的。除了现在我不能调用
Stack.Add
,我被迫调用
Add(Stack)

您可以查看

使用容器。堆栈;
通用的
类型值\u类型为范围;
基于包的堆栈是新的容器。堆栈(Value\u Type=>Value\u Type);
包装容器。整型_与预实验室堆叠为
类型Stack是新的Basis_Stack.Stack,带有private;
...

这确实需要用户实例化容器。适当地堆叠容器本身。

解决方案的想法不是提供更窄的类型,而是提供更多操作的类型

如果您想要一个更窄的类型,而您恰好在内部使用了现有的类型,您可以这样做(未测试的源代码):

private与容器\u堆栈;
通用的
类型值\u类型为范围;
package Containers.Integer\u堆栈
预产期
是
类型实例标记为private,记录为null;
程序添加(项目:输入输出实例);
程序减法(项目:输入输出实例);
私有的
包装内部_堆栈是新的容器。堆栈(值_类型);
类型实例被标记为private
记录;
数据:内部_Stack.Stack;
结束记录;
end Containers.Integer_堆栈;

这样,
Containers.Integer\u Stack
的客户端只能准确地使用您在包规范中明确列出的操作。

由于各种原因,其他建议的答案都很好,但是我认为在同级中自动公开基本容器类型的子例程太重要了。因此,最好的答案是我最初的实施。希望其他开发人员会发现其他答案很有帮助。

“但是,试图将包初始化放在私有部分,也会隐藏所有子例程。”是的。这就是做这件事的全部意义,正如你所写的,你想创建一个“狭隘的目标堆栈”。您仍然可以从“狭窄用途堆栈”所需的
Containers.Stacks.Stack
公开操作版本。
with Containers.Stacks;
generic
   type Value_Type is range <>;
   with package Basis_Stack is new Containers.Stacks (Value_Type => Value_Type);
package Containers.Integer_Stacks with Preelaborate is
   type Stack is new Basis_Stack.Stack with private;
...