delphi方法重载和默认参数

函数和过程是Delphi语言的重要组成部分。从Delphi4开始,Delphi允许我们使用支持默认参数的函数和过程(使参数成为可选的),并允许两个或多个例程具有相同的名称,但作为完全不同的例程运行。...

函数和过程是Delphi语言的重要组成部分。从Delphi4开始,Delphi允许我们使用支持默认参数的函数和过程(使参数成为可选的),并允许两个或多个例程具有相同的名称,但作为完全不同的例程运行。

Overloaded Functions Overloaded Functions

让我们看看重载和默认参数如何帮助您更好地编写代码。

超载

简单地说,重载就是用相同的名称声明多个例程。重载允许多个例程共享相同的名称,但具有不同数量的参数和类型。

作为一个例子,让我们考虑以下两个功能:

{Overloaded routines must be declared with the overload directive} function SumAsStr(a, b :integer): string; overload; begin Result := IntToStr(a + b) ; end; function SumAsStr(a, b : extended; Digits:integer): string; overload; begin Result := FloatToStrF(a + b, ffFixed, 18, Digits) ; end;

这些声明创建了两个函数,都称为SumAsStr,它们接受不同数量的参数,并且具有两种不同的类型。当我们调用重载例程时,编译器必须能够告诉我们要调用哪个例程。

例如,SumAsStr(6,3)调用第一个SumAsStr函数,因为它的参数是整数值。

注意:Delphi将通过代码完成和代码洞察帮助您选择正确的实现。

另一方面,考虑如果我们尝试调用SUMASSTR函数如下:

SomeString := SumAsStr(6.0,3.0)

我们将得到一个错误:“没有可以用这些参数调用的'SumAsStr'的重载版本。”这意味着我们还应该包括用于指定小数点后位数的Digits参数。

注意:编写重载例程时只有一条规则,即重载例程必须至少在一种参数类型上有所不同。相反,返回类型不能用于区分两个例程。

两个单元-一个程序

假设我们在单元A中有一个例程,单元B使用单元A,但声明了一个同名的例程。单元B中的声明不需要重载指令——我们应该使用单元A的名称来限定从单元B对A版本例程的调用。

考虑这样的事情:

unit B; ... uses A; ... procedure RoutineName; begin Result := A.RoutineName; end;

使用重载例程的另一种方法是使用默认参数,这通常会减少编写和维护的代码。

默认/可选参数

为了简化一些语句,我们可以为函数或过程的参数指定一个默认值,我们可以调用带有或不带参数的例程,使其成为可选的。要提供默认值,请在参数声明末尾加上等号(=)符号和常量表达式。

例如,给定声明

function SumAsStr (a,b : extended; Digits : integer = 2) : string;

以下函数调用是等效的。

SumAsStr(6.0, 3.0) SumAsStr(6.0, 3.0, 2)

注意:具有默认值的参数必须出现在参数列表的末尾,并且必须按值或常量传递。引用(var)参数不能有默认值。

当使用多个默认参数调用例程时,我们不能跳过参数(如在VB中):

function SkipDefParams(var A:string; B:integer=5, C:boolean=False):boolean; ... //this call generates an error message CantBe := SkipDefParams('delphi', , True) ;

使用默认参数重载

当同时使用函数或过程重载和默认参数时,不要引入模棱两可的例程声明。

考虑下面的声明:

procedure DoIt(A:extended; B:integer = 0) ; overload; procedure DoIt(A:extended) ; overload;

对DoIt过程(如DoIt(5.0))的调用不会编译。由于第一个过程中的默认参数,此语句可能同时调用这两个过程,因为无法确定要调用哪个过程。

  • 发表于 2021-10-13 10:34
  • 阅读 ( 145 )
  • 分类:数学

你可能感兴趣的文章

建造师(constructor)和析构函数(destructor)的区别

... 析构函数是用于释放对象内存的类的特殊成员。 调用方法 在创建对象时调用构造函数。 销毁或删除对象时调用析构函数。 使用 构造函数用于为对象分配内存。 析构函数用于释放对象的内存。 参数 构造函数接受参数...

  • 发布于 2020-10-18 11:50
  • 阅读 ( 274 )

压倒一切(overriding)和c中的过载#(overloading in c#)的区别

...中重写与重载# C中重写和重载之间的关键区别在于,重写方法调用对其定义的绑定发生在运行时,而重载的方法调用绑定到其定义发生在编译时。 C是微软开发的一种通用编程语言。C的主要优点是它支持面向对象编程(OOP)。OOP...

  • 发布于 2020-10-18 23:50
  • 阅读 ( 218 )

超载(overloading)和在java中重写(overriding in java)的区别

...发中的一个主要范式。它是一种使用类和对象设计程序的方法。班级就是蓝图。它描述了对象中应该包含的内容。或者应该定义对象的属性。因此,对象是类的实例。这些对象与其他对象通信。OOP的一个主要概念是多态性。它是...

  • 发布于 2020-10-19 21:20
  • 阅读 ( 366 )

超载(overloading)和覆盖(overriding)的区别

...一种特性,它允许在同一个类中创建几个具有相同名称的方法,但在函数的输入类型和输出类型方面彼此不同。方法重载通常与在函数调用中强制类型检查的静态编程语言相关联。这些最有可能与VB、.NET、C++、D、java等有关。重...

  • 发布于 2021-06-23 10:08
  • 阅读 ( 180 )

建造师(constructor)和方法(method)的区别

...Java编程语言的开发者是jamesgosling。建造师(c***tructor) vs. 方法(method)构造函数和方法的区别在于,构造函数用于系统隐式调用,而方法用于在程序代码期间调用。此外,还声明构造函数必须与类的名称相同,相反,方法的名称不能...

  • 发布于 2021-07-11 04:32
  • 阅读 ( 208 )

超载(overloading)和java中的重写(overriding in java)的区别

关键区别:重载意味着在同一类中有两个方法具有相同的名称和不同的参数类型,而重写意味着在同一类中有两个不同的方法具有相同的参数类型,但实现不同。 方法重写和重载是java编程语言中使用的两个概念或技术。这两...

  • 发布于 2021-07-13 21:16
  • 阅读 ( 163 )

如何将媒体文件嵌入delphi可执行文件(rc/.res)(embed media files into a delphi executable (rc/.res))

...止其他人操纵这些加载项文件。 本文将向您展示如何在Delphi可执行文件中嵌入(和使用)声音文件、视频剪辑、动画以及更一般的任何类型的二进制文件。对于最通用的用途,您将看到如何将MP3文件放入Delphi exe中。 资源文...

  • 发布于 2021-09-06 15:08
  • 阅读 ( 195 )

delphi编译器版本指令

如果您计划编写可以与多个版本的Delphi编译器一起使用的Delphi代码,您需要知道您的代码是在哪个版本下编译的。 假设您正在编写自己的商业自定义组件。组件的用户可能具有与您不同的Delphi版本。如果他们试图重新编译组...

  • 发布于 2021-09-06 15:09
  • 阅读 ( 164 )

将项目添加到tpopup delphi菜单

在Delphi应用程序中使用菜单或弹出菜单时,在大多数情况下,都是在设计时创建菜单项的。每个菜单项都由一个TMenuItem Delphi类表示。当用户选择(单击)一个项目时,OnClick事件将被触发,以供您(作为开发人员)获取该事件并...

  • 发布于 2021-09-06 15:10
  • 阅读 ( 166 )

理解delphi项目和单元源文件

简而言之,Delphi项目只是组成由Delphi创建的应用程序的文件集合。DPR是用于Delphi项目文件格式的文件扩展名,用于存储与项目相关的所有文件。这包括其他Delphi文件类型,如表单文件(DFM)和单元源文件(.PASs)。 由于Delphi...

  • 发布于 2021-09-06 15:15
  • 阅读 ( 175 )
jju539
jju539

0 篇文章

相关推荐