过程重载 (Visual Basic)

重载某个过程是指使用相同的名称但不同的参数列表在多个版本中定义该过程。 重载的目的是定义某个过程的多个密切相关的版本,而无需按名称区分这些版本。 可以通过更改参数列表来实现此目的。

重载规则

重载某个过程时,以下规则适用:

  • 相同的名称。 每个重载的版本必须使用相同的过程名称。

  • 不同的签名。 每个重载的版本必须至少在以下方面之一不同于所有其他重载的版本:

    • 参数数目

    • 参数的顺序

    • 参数的数据类型

    • 类型参数的数量(针对泛型过程)

    • 返回类型(仅针对转换运算符)

    上述各项与过程名称一起统称为过程的签名。 当你调用重载的过程时,编译器将使用签名来检查该调用是否与定义正确匹配。

  • 项不是签名的一部分。 在不更改签名的情况下无法重载过程。 具体而言,只是更改以下一项或多项无法重载过程:

    • 过程修饰符关键字,例如 PublicSharedStatic

    • 参数或类型参数名称

    • 类型参数约束(针对泛型过程)

    • 参数修饰符关键字,例如 ByRefOptional

    • 是否返回值

    • 返回值的数据类型(对于转换运算符除外)

    上述列表中的项不是签名的一部分。 尽管无法使用它们来区分重载的版本,但可以在按签名正确区分的重载版本之间更改它们。

  • 后期绑定参数。 如果你打算将后期绑定对象变量传递给重载的版本,则必须将相应的参数声明为 Object

一个过程的多个版本

假设你正在编写一个 Sub 过程以根据客户的余额进行交易过账,并希望能够按姓名或账号来引用该客户。 为实现此目的,可以定义两个不同的 Sub 过程,如以下示例所示:

Sub postName(ByVal custName As String, ByVal amount As Single)
    ' Insert code to access customer record by customer name.
End Sub
Sub postAcct(ByVal custAcct As Integer, ByVal amount As Single)
    ' Insert code to access customer record by account number.
End Sub

重载的版本

另一种方法是重载单个过程名称。 可以使用 Overloads 关键字为每个参数列表定义一个过程版本,如下所示:

Overloads Sub post(ByVal custName As String, ByVal amount As Single)
    ' Insert code to access customer record by customer name.
End Sub
Overloads Sub post(ByVal custAcct As Integer, ByVal amount As Single)
    ' Insert code to access customer record by account number.
End Sub

其他重载

如果你还想接受 DecimalSingle 格式的交易金额,可以进一步重载 post 以做出这种变化。 如果对以上示例中的每个重载都执行了此操作,则你会得到四个 Sub 过程,它们具有相同的名称,但具有四个不同的签名。

重载的优势

重载过程的优势体现在调用的灵活性。 若要使用以上示例中声明的 post 过程,调用代码可以获取 StringInteger 格式的客户标识,然后在任一情况下调用同一过程。 以下示例对此进行了说明:

Imports MSVB = Microsoft.VisualBasic
Dim customer As String
Dim accountNum As Integer
Dim amount As Single
customer = MSVB.Interaction.InputBox("Enter customer name or number")
amount = MSVB.Interaction.InputBox("Enter transaction amount")
Try
    accountNum = CInt(customer)
    Call post(accountNum, amount)
Catch
    Call post(customer, amount)
End Try

另请参阅