重载的属性和方法 (Visual Basic)

重载是在类中创建多个过程、实例构造函数或属性,其名称相同,但参数类型不同。

重载的用途

当对象模型要求对不同数据类型的操作使用相同名称时,重载特别有用。 例如,一个可以显示多种数据类型的类可以具有如下所示的Display过程:

Overloads Sub Display(ByVal theChar As Char)
    ' Add code that displays Char data.
End Sub
Overloads Sub Display(ByVal theInteger As Integer)
    ' Add code that displays Integer data.
End Sub
Overloads Sub Display(ByVal theDouble As Double)
    ' Add code that displays Double data.
End Sub

如果不重载,则需要为每个过程创建不同的名称,即使它们执行相同的工作,如下所示:

Sub DisplayChar(ByVal theChar As Char)
    ' Add code that displays Char data.
End Sub
Sub DisplayInt(ByVal theInteger As Integer)
    ' Add code that displays Integer data.
End Sub
Sub DisplayDouble(ByVal theDouble As Double)
    ' Add code that displays Double data.
End Sub

重载使得使用属性或方法更容易,因为它可提供多个数据类型的选择。 例如,可使用以下任一代码行调用上述重载的 Display 方法:

' Call Display with a literal of type Char.
Display("9"c)
' Call Display with a literal of type Integer.
Display(9)
' Call Display with a literal of type Double.
Display(9.9R)

在运行时,Visual Basic 会根据指定的参数的数据类型调用正确的过程。

重载规则

通过添加具有相同名称的两个或多个属性或方法,为类创建重载成员。 除重载派生成员外,每个重载成员必须具有不同的参数列表,在重载属性或过程时,不能将以下项用作区分功能:

  • 用于成员或成员参数的修饰符,例如ByValByRef

  • 参数的名称

  • 过程的返回类型

重载时,Overloads 关键字是可选的,但如果任何重载的成员使用了 Overloads 关键字,那么所有具有相同名称的其他重载的成员也必须指定此关键字。

派生类可以使用具有相同参数和参数类型的成员来重载继承的成员,此过程称为“按名称和签名遮蔽”。 如果在按名称和签名遮蔽时使用 Overloads 关键字,则会使用派生类的成员实现而不是基类中的实现,并且该成员的所有其他重载将对该派生类的实例可用。

如果在使用具有相同参数和参数类型的成员重载继承的成员时省略 Overloads 关键字,则重载称为“按名称遮蔽”。 按名称遮蔽将替换继承的成员实现,并使所有其他重载对派生类及其后代的实例不可用。

OverloadsShadows修饰符不能与同一属性或方法一起使用。

示例:

以下示例创建接受美元金额的 StringDecimal 表示形式并返回包含销售税的字符串的重载方法。

使用此示例创建重载的方法

  1. 打开一个新项目并添加一个名为TaxClass的类。

  2. 将以下代码添加到 TaxClass 类。

    Public Class TaxClass
        Overloads Function TaxAmount(ByVal decPrice As Decimal,
             ByVal TaxRate As Single) As String
            TaxAmount = "Price is a Decimal. Tax is $" &
               (CStr(decPrice * TaxRate))
        End Function
    
        Overloads Function TaxAmount(ByVal strPrice As String,
              ByVal TaxRate As Single) As String
            TaxAmount = "Price is a String. Tax is $" &
               CStr((CDec(strPrice) * TaxRate))
        End Function
    End Class
    
  3. 将以下过程添加到窗体中。

    Sub ShowTax()
        ' 8% tax rate.
        Const TaxRate As Single = 0.08
        ' $64.00 Purchase as a String.
        Dim strPrice As String = "64.00"
        ' $64.00 Purchase as a Decimal.
        Dim decPrice As Decimal = 64
        Dim aclass As New TaxClass
        'Call the same method with two different kinds of data.
        MsgBox(aclass.TaxAmount(strPrice, TaxRate))
        MsgBox(aclass.TaxAmount(decPrice, TaxRate))
    End Sub
    
  4. 将一个按钮添加到窗体,并从该按钮的 ShowTax 事件调用 Button1_Click 过程。

  5. 运行该项目,并单击窗体中的按钮以测试重载的 ShowTax 过程。

在运行时,编译器选择与所使用的参数匹配的相应重载函数。 单击按钮时,首先会调用 Price 重载的方法,其参数为字符串,消息为“Price 为字符串”。 显示税款为 $5.12”。 TaxAmount 第二次调用时使用 Decimal 值,并显示消息“Price 为小数。 显示税款为 $5.12”。

另请参阅