跳转到内容

Ada 编程/函数重载

来自维基教科书,自由的教科书

Ada. Time-tested, safe and secure.
Ada。经时间考验,安全可靠。

函数重载(也称方法重载)是一种编程概念,允许程序员定义两个或多个具有相同名称并在相同范围内的函数。

每个函数都有一个唯一的签名(或头文件),它源自

  1. 函数/过程名称
  2. 参数数量
  3. 参数类型
  4. 参数顺序
  5. 参数名称
  6. 返回值类型

请注意:并非所有上述签名选项在所有编程语言中都可用。

可用的函数重载
语言 1 2 3 4 5 6
Ada
C++
Java
Swift

警告:函数重载经常与函数重写混淆。在函数重载中,创建了一个具有不同签名的函数,添加到可用函数池中。然而,在函数重写中,声明了一个具有相同签名的函数,替换了新函数上下文中的旧函数。

由于函数名称在这种情况下相同,我们必须通过更改参数列表(最后三个外星人)中的某些内容来保留签名的唯一性。

如果函数的签名足够不同,编译器可以区分在每次出现时要使用哪个函数。这个搜索适当函数的过程称为函数解析,它可能相当密集,尤其是在有很多同名函数的情况下。

支持隐式类型约定的编程语言通常在没有完全匹配的函数时使用参数提升(即整数到浮点数的类型转换)。参数降级很少使用。

当两个或多个函数匹配函数解析过程中的条件时,编译器会报告歧义错误。通过编辑源代码(例如使用类型转换)为编译器添加更多信息,可以解决此类疑虑。

示例代码展示了如何使用函数重载。由于函数实际上执行相同的操作,因此使用函数重载是有意义的。

文件:function_overloading.adb (查看纯文本下载页面浏览所有)
function Generate_Number (MaxValue : Integer) return Integer is
   subtype Random_Type is Integer range 0 .. MaxValue;
   package Random_Pack is new Ada.Numerics.Discrete_Random (Random_Type);
 
   G : Random_Pack.Generator;
begin
   Random_Pack.Reset (G);
   return Random_Pack.Random (G);
end Generate_Number;


function Generate_Number (MinValue : Integer;
                          MaxValue : Integer) return Integer
is
   subtype Random_Type is Integer range MinValue .. MaxValue;
   package Random_Pack is new Ada.Numerics.Discrete_Random (Random_Type);
 
   G : Random_Pack.Generator;
begin
   Random_Pack.Reset (G);
   return Random_Pack.Random (G);
end Generate_Number;

调用第一个函数

[编辑 | 编辑源代码]

第一个代码块将生成从 0 到指定参数MaxValue的数字。适当的函数调用是

 Number_1 : Integer := Generate_Number (10);

调用第二个函数

[编辑 | 编辑源代码]

第二个需要另一个参数MinValue。函数将返回大于或等于MinValue且小于MaxValue的数字。

 Number_2 : Integer := Generate_Number (6, 10);

Ada 中的函数重载

[编辑 | 编辑源代码]

Ada 支持所有六个签名选项,但是如果您使用参数名称作为选项,则在调用函数时始终必须命名参数。即

Number_2 : Integer := Generate_Number (MinValue => 6,
                                       MaxValue => 10);

请注意,您不能在同一个包中重载泛型过程或泛型函数。以下示例将无法编译

 package myPackage
   generic
     type Value_Type is (<>);  
   -- The first declaration of a generic subprogram
   -- with the name "Generic_Subprogram"
   procedure Generic_Subprogram (Value : in out Value_Type);
   ...
   generic
     type Value_Type is (<>); 
   -- 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.
   procedure Generic_Subprogram;
   ...
   generic
     type Value_Type is (<>); 
   -- The same situation.
   -- Even though this is a function and not
   -- a procedure, generic overloading of
   -- the name "Generic_Subprogram" is not allowed.
   function Generic_Subprogram (Value : Value_Type) return Value_Type;
 end myPackage;

维基教科书

[编辑 | 编辑源代码]

Ada 95 参考手册

[编辑 | 编辑源代码]

Ada 2005 参考手册

[编辑 | 编辑源代码]
华夏公益教科书