Ada 编程/函数重载
外观
< Ada 编程
函数重载(也称方法重载)是一种编程概念,允许程序员定义两个或多个具有相同名称并在相同范围内的函数。
每个函数都有一个唯一的签名(或头文件),它源自
- 函数/过程名称
- 参数数量
- 参数类型
- 参数顺序
- 参数名称
- 返回值类型
请注意:并非所有上述签名选项在所有编程语言中都可用。
| 语言 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| Ada | 是 | 是 | 是 | 是 | 是 | 是 |
| C++ | 是 | 是 | 是 | 是 | 否 | 否 |
| Java | 是 | 是 | 是 | 是 | 否 | 否 |
| Swift | 是 | 是 | 是 | 是 | 是 | 是 |
警告:函数重载经常与函数重写混淆。在函数重载中,创建了一个具有不同签名的函数,添加到可用函数池中。然而,在函数重写中,声明了一个具有相同签名的函数,替换了新函数上下文中的旧函数。
由于函数名称在这种情况下相同,我们必须通过更改参数列表(最后三个外星人)中的某些内容来保留签名的唯一性。
如果函数的签名足够不同,编译器可以区分在每次出现时要使用哪个函数。这个搜索适当函数的过程称为函数解析,它可能相当密集,尤其是在有很多同名函数的情况下。
支持隐式类型约定的编程语言通常在没有完全匹配的函数时使用参数提升(即整数到浮点数的类型转换)。参数降级很少使用。
当两个或多个函数匹配函数解析过程中的条件时,编译器会报告歧义错误。通过编辑源代码(例如使用类型转换)为编译器添加更多信息,可以解决此类疑虑。
示例代码展示了如何使用函数重载。由于函数实际上执行相同的操作,因此使用函数重载是有意义的。
functionGenerate_Number (MaxValue : Integer)returnIntegerissubtypeRandom_TypeisIntegerrange0 .. MaxValue;packageRandom_PackisnewAda.Numerics.Discrete_Random (Random_Type); G : Random_Pack.Generator;beginRandom_Pack.Reset (G);returnRandom_Pack.Random (G);endGenerate_Number;functionGenerate_Number (MinValue : Integer; MaxValue : Integer)returnIntegerissubtypeRandom_TypeisIntegerrangeMinValue .. MaxValue;packageRandom_PackisnewAda.Numerics.Discrete_Random (Random_Type); G : Random_Pack.Generator;beginRandom_Pack.Reset (G);returnRandom_Pack.Random (G);endGenerate_Number;
第一个代码块将生成从 0 到指定参数MaxValue的数字。适当的函数调用是
Number_1 : Integer := Generate_Number (10);
第二个需要另一个参数MinValue。函数将返回大于或等于MinValue且小于MaxValue的数字。
Number_2 : Integer := Generate_Number (6, 10);
Ada 支持所有六个签名选项,但是如果您使用参数名称作为选项,则在调用函数时始终必须命名参数。即
Number_2 : Integer := Generate_Number (MinValue => 6,
MaxValue => 10);
请注意,您不能在同一个包中重载泛型过程或泛型函数。以下示例将无法编译
packagemyPackagegenerictypeValue_Typeis(<>); -- The first declaration of a generic subprogram -- with the name "Generic_Subprogram"procedureGeneric_Subprogram (Value :inoutValue_Type); ...generictypeValue_Typeis(<>); -- This subprogram has the same name, but no -- input or output parameters. A non-generic -- procedure would be overloaded here. -- Since this procedure is generic, overloading -- is not allowed and this package will not compile.procedureGeneric_Subprogram; ...generictypeValue_Typeis(<>); -- The same situation. -- Even though this is a function and not -- a procedure, generic overloading of -- the name "Generic_Subprogram" is not allowed.functionGeneric_Subprogram (Value : Value_Type)returnValue_Type;endmyPackage;
- 6.6:运算符重载 [注释]
- 8.6:重载解析的上下文 [注释]
- 6.6:运算符重载 [注释]
- 8.6:重载解析的上下文 [注释]
