多載屬性和方法 (Visual Basic)
多載化 (Overloading) 是建立具有相同名稱但不同引數型別的多個程序、執行個體建構函式或類別屬性。
多載化使用方式
當物件模型規定您針對在不同資料型別上作業的程序採用相似的名稱時,多載化就特別有用。 例如,可顯示數種不同資料型別的類別,可具有類似於下列範例的 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 會依據您指定的參數資料型別來呼叫正確的程序。
多載化規則
您以加入二或多個相同名稱的屬性或方法的方式為類別建立多載成員。 除了多載衍生成員外,每個多載成員都必須具有不同的參數清單;而在多載化屬性或程序時,無法將下列項目當做差異功能使用:
套用至成員或成員參數的修飾詞,例如 ByVal 或 ByRef。
參數名稱
程序的傳回型別
多載化時,您可以選擇是否使用 Overloads 關鍵字,但是如果任何多載成員使用了 Overloads 關鍵字,那麼其他所有相同名稱的多載成員也必須指定此關鍵字。
衍生類別 (Derived Class) 會使用具有相同參數和參數型別的成員,來多載受繼承的成員,此程序稱為「以名稱和簽章遮蔽」(Shadowing by Name and Signature)。 如果在名稱和簽章被遮蔽時使用 Overloads 關鍵字,將使用成員的衍生類別實作,來取代基底類別的實作,衍生類別的執行個體將可使用該成員的其他多載。
如果使用具有相同參數和參數型別的成員,來多載化繼承的成員時,則會省略 Overloads 關鍵字,這種多載化稱為「以名稱遮蔽」(Shadowing by Name)。 以名稱遮蔽會取代成員的繼承實作,且衍生類別的執行個體及其子系,會無法使用其他多載。
Overloads 和 Shadows 修飾詞無法用於相同名稱的屬性或方法。
範例
下列範例所建立的多載方法,可接受表示金額的 String 或 Decimal,並傳回包含營業稅的字串。
若要使用這個範例來建立多載方法
開啟新專案並加入名為 TaxClass 的類別。
將下列程式碼加入至 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
將下列程序加入至表單。
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
將按鈕加入至表單,並從按鈕的 Button1_Click 事件來呼叫 ShowTax 程序。
執行專案並按一下表單上的按鈕,以測試多載 ShowTax 程序。
在 Run Time 時,編譯器 (Compiler) 會選擇符合所使用參數的適當多載函式。 當您按一下按鈕時,會先使用字串參數 Price 來呼叫多載方法,並顯示訊息 "Price is a String . Tax is $5.12"。 第二次則使用 Decimal 值來呼叫 TaxAmount,顯示的訊息是 "Price is a Decimal. Tax is $5.12"。