重载过程注意事项 (Visual Basic)

重载过程时,必须对每个重载版本使用不同的“签名”。 这通常意味着每个版本必须指定不同的参数列表。 有关更多信息,请参见 过程重载 (Visual Basic) 中的“不同签名”。

您可以在 Sub 过程中重载 Function 过程,反之亦然,只要它们有不同的签名。 如果两个重载只是一个有返回值,另一个没有,则无法进行区分。

可以按照重载过程的方式来重载属性,并且采用相同的限制。 但是,不能使用属性来重载过程,也不能使用过程来重载属性。

可选重载版本

有时可能会有可选重载版本,特别是有可选参数或参数的个数可变时。

请注意,不是所有语言都支持可选参数,参数数组仅限于 Visual Basic。 如果您编写的过程可能会被多种不同语言编写的代码调用,那么重载版本提供了最大的灵活性。

重载和可选参数

如果调用代码可以选择提供或省略一个或多个参数,则可以定义多个重载版本或使用可选参数。

何时使用重载版本

在以下情况可以考虑定义一系列重载版本:

  • 根据调用代码是否提供可选参数,过程代码中的逻辑会有显著的不同。

  • 过程代码无法对调用代码是否提供了可选参数进行可靠的测试。 例如,如果对于调用代码未能提供的默认值,没有可行的候选值,就是这种情况。

何时使用可选参数

在以下情况可能需要使用一个或多个可选参数:

  • 如果调用代码没有提供可选参数,则唯一的操作是将参数设置为默认值。 在这种情况下,如果只定义带有一个或多个 Optional 参数的单个版本,可以降低过程代码的复杂程度。

有关更多信息,请参见 可选参数 (Visual Basic)

重载和 ParamArray

如果调用代码可以传递的参数个数是可变的,则可以定义多个重载版本或使用参数数组。

何时使用重载版本

在以下情况可以考虑定义一系列重载版本:

  • 您知道调用代码始终不会较多的值传递给参数数组。

  • 根据调用代码传递多少个值,过程代码中的逻辑会有显著的不同。

  • 调用代码可以传递不同数据类型的值。

何时使用参数数组

在以下情况更适合采用 ParamArray 参数:

  • 无法预测调用代码可以向参数数组传递多少个值,而且值的个数可能很多。

  • 过程逻辑对每个值执行大体相同的操作,从而可以循环访问调用代码传递的所有值。

有关更多信息,请参见 参数数组 (Visual Basic)

可选参数的隐式重载

带有一个 Optional (Visual Basic) 参数的过程等效于两个重载过程,其中一个过程带有这个可选参数,另一个过程不带有这个可选参数。 您不能重载这样的一个过程,其参数列表对应于这两个过程中的任何一个。 下面的声明阐释了这一点。

Overloads Sub q(ByVal b As Byte, Optional ByVal j As Long = 6)
' The preceding definition is equivalent to the following two overloads.
' Overloads Sub q(ByVal b As Byte)
' Overloads Sub q(ByVal b As Byte, ByVal j As Long)
' Therefore, the following overload is not valid because the signature is already in use.
' Overloads Sub q(ByVal c As Byte, ByVal k As Long)
' The following overload uses a different signature and is valid.
Overloads Sub q(ByVal b As Byte, ByVal j As Long, ByVal s As Single)

对于带多个可选参数的过程,存在一组隐式重载,产生它们的逻辑类似于前面示例中的逻辑。

ParamArray 参数的隐式重载

编译器将带 ParamArray (Visual Basic) 参数的过程视为具有数量无限的重载,这些重载以调用代码传递给参数数组的内容加以区分,如下所示:

  • 调用代码没有向 ParamArray 提供参数时的一个重载

  • 调用代码提供了 ParamArray 元素类型的一维数组时的一个重载

  • 对于每个正整数,调用代码提供该数量的参数时的重载,每个都是 ParamArray 元素类型

下面的声明阐释了这些隐式重载。

Overloads Sub p(ByVal d As Date, ByVal ParamArray c() As Char)
' The preceding definition is equivalent to the following overloads.
' Overloads Sub p(ByVal d As Date)
' Overloads Sub p(ByVal d As Date, ByVal c() As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char)
' Overloads Sub p(ByVal d As Date, ByVal c1 As Char, ByVal c2 As Char)
' And so on, with an additional Char argument in each successive overload.

您不能重载这样的一个过程,其参数列表采用一维参数数组的形式。 但是,您可以使用其他隐式重载的签名。 下面的声明阐释了这一点。

' The following overload is not valid because it takes an array for the parameter array.
' Overloads Sub p(ByVal x As Date, ByVal y() As Char)
' The following overload takes a single value for the parameter array and is valid.
Overloads Sub p(ByVal z As Date, ByVal w As Char)

作为替换重载的方法 — 无类型编程

如果要使调用代码可以将不同的数据类型传递给某个参数,则可选方法为 Visual Basic 中的无类型编程。 可以使用编译器选项 Option Strict 语句/optionstrict 将类型检查开关设置为 Off。 这样,就不一定要声明参数的数据类型。 然而同重载相比,该方法有以下缺点:

  • 无类型编程产生的执行代码效率较低。

  • 过程必须测试每一个预期将传递的数据类型。

  • 如果调用代码传递了过程不支持的数据类型,编译器不能发出错误信号。

请参见

任务

过程疑难解答 (Visual Basic)

如何:定义一个过程的多个版本 (Visual Basic)

如何:调用重载过程 (Visual Basic)

如何:重载带有可选参数的过程 (Visual Basic)

如何:重载参数数量不确定的过程 (Visual Basic)

参考

Overloads (Visual Basic)

概念

Visual Basic 中的过程

过程参数和变量 (Visual Basic)

重载决策 (Visual Basic)