重载过程时,必须为每个重载版本使用不同的 签名 。 这通常意味着每个版本必须指定不同的参数列表。 有关详细信息,请参阅 过程重载中的“不同签名”。
可以使用 Function
过程重载 Sub
过程,反之亦然,但前提是它们具有不同的签名。 两个重载不能仅仅因为一个有返回值而另一个没有返回值而有所不同。
可以以与重载过程相同的方式重载属性,并具有相同的限制。 但是,不能使用属性重载过程,反之亦然。
重载版本的替代方法
有时,可以使用重载版本的替代方法,特别是当参数的存在是可选的或其数量可变时。
请记住,可选参数不一定受所有语言支持,参数数组仅限于 Visual Basic。 如果要编写一个可能从用多种不同语言编写的代码调用的过程,重载版本可以提供最大的灵活性。
重载和可选参数
当调用代码可以选择提供或省略一个或多个参数时,可以定义多个重载版本或使用可选参数。
何时使用重载版本
可以考虑在以下情况下定义一系列重载版本:
过程代码中的逻辑明显不同,具体取决于调用代码是否提供可选参数。
过程代码无法可靠地测试调用代码是否提供了可选参数。 例如,如果没有可能的候选默认值,而调用代码又不可能提供的话,就会出现这种情况。
何时使用可选参数
在以下情况下,你可能更喜欢一个或多个可选参数:
- 当调用代码不提供可选参数时,唯一必需的作是将参数设置为默认值。 在这种情况下,如果使用一个或多个
Optional
参数定义单个版本,则过程代码可能不太复杂。
有关详细信息,请参阅 可选参数。
重载和 ParamArray
当调用代码可以传递可变数量的参数时,可以定义多个重载版本或使用参数数组。
何时使用重载版本
可以考虑在以下情况下定义一系列重载版本:
你知道调用代码永远不会将多个值传递给参数数组。
过程代码中的逻辑因调用代码传递的值数量而大相径庭。
调用代码可以传递不同数据类型的值。
何时使用参数数组
在以下情况下,你最好使用 ParamArray
参数:
无法预测调用代码可以传递给参数数组的值数,并且可能为大数。
过程逻辑本身适合于遍历调用代码传递的所有值,基本上对每个值执行相同的操作。
有关详细信息,请参阅 参数数组。
可选参数的隐式重载
具有 Optional 参数的过程等效于两个重载过程,一个具有可选参数,一个没有该参数。 不能使用与上述任一项对应的参数列表重载此类过程。 以下声明说明了这一点。
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 参数的过程视为具有无限数量的重载,区别在于调用代码传递给参数数组的内容,如下所示:
当调用代码不为
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)
无类型编程作为重载的替代方法
如果想要允许调用代码将不同的数据类型传递给参数,另一种方法是无类型编程。 可以使用 Off
或 -optionstrict 编译器选项将类型检查开关设置为 。 然后,无需声明参数的数据类型。 但是,与重载相比,此方法具有以下缺点:
无类型编程生成效率较低的执行代码。
该过程必须测试它预计通过的每个数据类型。
如果调用代码传递过程不支持的数据类型,编译器将无法发出错误信号。