(delphi11最新学习资料) Object Pascal 学习笔记---第4章第2.5节(重载和模糊调用)
4.2.5 重载和模糊调用
当调用一个重载的函数时,编译器通常会找到匹配的版本并正确工作,或者如果没有任何重载版本具有正确匹配的参数(正如我们刚刚看到的),则会报出错误。
但还有第三种情况:假设编译器可以对函数的参数进行一些类型转换,则单个调用可能会有不同的可能转换。当编译器找到它可以调用的函数的多个版本,并且没有一个是完全类型匹配的版本(将被选取)时,它会发出一条错误消息,指示函数调用不明确。
这不是一个常见的场景,我不得不构建一个相当不合逻辑的例子来向你展示它,但值得考虑这种情况(因为它在现实世界中偶尔会发生)。
假设您决定实现两个重载函数把一个整数和浮点数相加:
function Add(N: Integer; S: Single): Single; overload;
begin
Result := N + S;
end;
function Add(S: Single; N: Integer): Single; overload;
begin
Result := N + S;
end;
这些函数在 OverloadTest 示例中。现在,您可以以任何顺序传递两个参数来调用它们:
Show(Add(10, 10.0).ToString);
Show(Add(10.0, 10).ToString);
但事实上,一般来说,函数可以进行转换接受不同类型的参数,例如,当函数期望参数为浮点类型时,可以接受整数类型的参数。那么,如果您调用:
Show(Add(10, 10).ToString);
编译器可以调用重载函数的第一个版本,但它也可以调用第二个版本。如果编译器不知道你在要求什么(也不知道调用一个函数或另一个函数是否会产生相同的效果),它就会报出错误信息:
[dcc32 Error] E2251 Ambiguous overloaded call to 'Add'
Related method: function Add(Integer; Single): Single;
Related method: function Add(Single; Integer): Single;
小贴士:在集成开发环境的错误窗格中,你会看到上面第一行的错误信息,边上有一个加号,可以展开查看下面两行,详细说明了编译器认为哪些重载函数有歧义。
如果这是一个真实的情况,并且您需要进行函数调用,您可以添加手动类型转换调用来解决问题,并向编译器指示您想要调用函数的哪个版本:
Show(Add(10, 10.ToSingle).ToString);
如果您使用变体(variants),这是一种我将在本书后面介绍的相当独特的数据类型,有可能出现模糊调用的特殊情况。