(delphi11最新学习资料) Object Pascal 学习笔记---第4章第2.4节(函数重载)

4.2.4 函数重载

​ 有时您可能想要两个非常相似但参数和实现不同的函数。传统做法是,您必须为每个函数想出一个稍微不同的名称,但是现代编程语言允许您对一个函数符号进行多次定义。

​ 重载的概念很简单:编译器允许您使用相同的名称定义两个或两个以上的函数或过程,前提是参数不同。通过检查参数,编译器可以确定您正在调用哪个版本的函数。

​ 考虑一下从运行时库的System.Math单元中提取的这系列函数:

function Min(A, B: Integer): Integer; overload;
function Min(A, B: Int64): Int64; overload;
function Min(A, B: Single): Single; overload;
function Min(A, B: Double): Double; overload;
function Min(A, B: Extended): Extended; overload;

​ 当您调用Min(10, 20)时,编译器确定您正在调用Min的多个版本中的第一个函数,它接受两个整数并返回一个整数。

​ 重载有两个基本规则:

  • 重载函数(或过程)的每个版本其后必须跟overload关键字(包括第一个版本)。
  • 重载的函数之间,参数的数量或类型必须有所不同。参数名称不用考虑,因为它们在调用时未指定。而且,返回类型不能用于区分两个重载的函数。

**注解:**不能根据返回值区分函数的规则有一个例外,那就是第 5 章中将介绍的隐式和显式(Implicit and Explicit conversion)转换操作符。

​ 以下是我添加到Overload-Test示例中的三个重载版本的ShowMsg过程:

procedure ShowMsg(Str: string); overload;
begin
  Show('Message: ' + Str);
end;

procedure ShowMsg(FormatStr: string; Params: array of const); overload;
begin
  Show('Message: ' + Format(FormatStr, Params));
end;

procedure ShowMsg(I: Integer; Str: string); overload;
begin
  Show(I.ToString + ' ' + Str);

​ 这三个函数显示了一个带有字符串的消息框,之后可以用不同的方式格式化字符串。以下是这三个过程的调用:

ShowMsg('Hello');
ShowMsg('Total = %d.', [100]);
ShowMsg(10, 'MBytes');

这是它们的效果:

  Message: Hello
  Message: Total = 100.
  Message: 10 MBytes

小贴士: IDE的Code Parameters技术在处理重载的过程和函数时效果非常好。在键入例程名称后的开括号后,将列出所有可用的方案。随着输入参数,Code Insight技术使用它们的类型确定哪些可选方案仍然有效。

​ 如果尝试使用不匹配任何可用重载版本的参数调用函数会发生什么呢?当然,您会收到错误消息。假设您想调用:

ShowMsg(10.0, 'Hello');

​ 在这种情况下,您将看到一个非常明确的错误:

[dcc32 Error] E2250 There is no overloaded version of 'ShowMsg' that can be called with these arguments

​ 重载例程的每个版本都必须正确标记,这意味着不能重载未使用overload关键字标记的同一单元的现有例程。

​ 当您尝试这样做时,您会收到以下错误消息:

Previous declaration of '' was not marked with the 'overload' directive.

​ 但是,您可以创建与不同单元例程同名的例程,因为单元充当了命名空间。在这种情况下,您并没有使用新版本重载了函数,而是使用新版本替换了该函数,隐藏了原始函数(可以使用单元名称前缀引用它)。这就是为什么编译器无法根据参数选择合适版本,但它将尝试匹配它看到的唯一版本,如果参数类型不匹配,则会发出错误。

你可能感兴趣的:(Object,Pascal,Handbook,学习,笔记,delphi,Object,Pascal,delphi11)