重载的属性和方法 (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. 将一个按钮添加到窗体,并从该按钮的 Button1_Click 事件调用 ShowTax 过程。

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

在运行时,编译器将选择与所用参数匹配的相应重载的函数。 单击该按钮时,首先会结合 Price 参数(一个字符串)调用重载的方法,并显示消息“Price is a String. Tax is $5.12”。 第二次会结合 Decimal 值调用 TaxAmount,并显示消息“Price is a Decimal. Tax is $5.12”。

另请参阅