Generics 为什么预定义类型的变量包含在;“通用”吗;?(美国残疾人协会)

Generics 为什么预定义类型的变量包含在;“通用”吗;?(美国残疾人协会),generics,ada,Generics,Ada,我目前在上CS大学,刚开始上数据结构和算法课。我的教授强烈建议(实际上是强迫我们)我们使用Ada。为了取得进展,我开始查找一些东西,并发现以下代码片段描述了如何编写通用堆栈: generic Max: Positive; type Element_T is private; package Generic_Stack is procedure Push (E: Element_T); function Pop return Element_T; end Generic_Stac

我目前在上CS大学,刚开始上数据结构和算法课。我的教授强烈建议(实际上是强迫我们)我们使用Ada。为了取得进展,我开始查找一些东西,并发现以下代码片段描述了如何编写通用堆栈:

generic
  Max: Positive; 
  type Element_T is private;
package Generic_Stack is
  procedure Push (E: Element_T);
  function Pop return Element_T;
end Generic_Stack;
让我印象深刻的是变量“Max”。因为它是正数类型,所以它似乎不符合逻辑,它是泛型的。也许我对这个想法还太陌生,但我认为泛型背后的想法是它基本上是一个空壳,可以在实例化时与不同的数据类型交换


也许我只是对泛型理解不够。如果没有,有人能告诉我吗

在泛型的形式部分中包含一个变量是一种传递常量(在编译时)以配置泛型的方法。这样的常量可用于定义某些数据结构(如数组(1..Max))中的其他变量,但这并不总是通过将值作为参数传递给子程序来实现的。
另外,这可以确保Push和Pop都使用相同的“Max”常量(将这样的常量作为参数传递给两个子程序是没有意义的)

另请参见。另外,请参见我已经阅读了这两篇文章,但它仍然不能完全回答我的问题。在Ada泛型编程的文章中,我想我找到了一个关于我所得到的部分,但我仍然不确定它到底想说什么。直观的做法似乎是在包内简单地声明和定义Max。
Max
的通用特性是,它允许堆栈的大小是通用的,只有在实例化
generic\u stack
时才成为实际大小(编译时安排)。如果在包体中为
1..Max
元素数组使用了
Max
,则需要一些大小信息,例如
Max
。我仍然不确定是否遵循。为什么将其作为参数传递没有意义?而且,我仍然不明白为什么它必须是通用的。如果我没有意识到这段代码,我可能会在包中定义它。你可以在包中定义它,得到相同的结果。但是,想要使用您的软件包的人无法控制它。例如,您决定数组大小应为20,但如果用户希望数组大小为30,则必须复制源以更改常量。但是如果你在形式部分传递它,用户就可以控制它,并且可以简单地用不同的常量值多次实例化你的包。但是,如果我在包中添加了一个过程,允许用户更改值,即使它是在包中定义的,又会怎么样呢?那么它就不再是常量了。我不能用它来定义一个类型,比如
类型我的数组是整数数组(1..Max)
,但是如果我把它放在形式部分,我可以让用户操纵Max?