當您多載程序時,您必須針對每個多載版本使用不同的 簽章。 這通常表示每個版本都必須指定不同的參數清單。 如需詳細資訊,請參閱 程式多載中的「不同簽章」。
您可以重載一個Function
程序與一個Sub
程序,反之亦然,前提是它們有不同的方法簽名。 兩個多載不能僅僅因為一個有傳回值而另一個沒有就有所不同。
您可以用與重載程序相同的方式來重載屬性,並使用相同的限制。 不過,您無法使用 屬性多載程式,反之亦然。
多載版本的替代方案
您有時會有重載版本的替代方案,特別是在參數的存在是選擇性或數量可變的時候。
請記住,所有語言不一定支持選擇性自變數,而且參數陣列僅限於Visual Basic。 如果您正在撰寫一個可能會被以多種不同程式語言撰寫的代碼調用的程序,使用多載版本可以提供最大的彈性。
多載和選擇性自變數
當呼叫程式代碼可以選擇性地提供或省略一或多個自變數時,您可以定義多個多載版本或使用選擇性參數。
使用多載版本的時機
在下列情況下,您可以考慮定義一系列多載版本:
程式代碼中的邏輯會根據呼叫端程式代碼是否提供選擇性自變數而明顯不同。
程式代碼無法可靠地測試呼叫程式代碼是否提供選擇性自變數。 例如,如果呼叫程式碼無法提供任何可能的預設值候選項,這就是這種情況。
使用選擇性參數的時機
在下列情況下,您可能會偏好使用一或多個選擇性參數:
- 呼叫程式代碼未提供選擇性自變數時,唯一必要的動作是將參數設定為預設值。 在這種情況下,如果您使用一或多個
Optional
參數來定義單一版本,程式代碼可能會比較不複雜。
如需詳細資訊,請參閱 選擇性參數。
多載和參數數組
當呼叫代碼可以傳遞不定數量的引數時,您可以定義多個多載版本或使用參數陣列。
使用多載版本的時機
在下列情況下,您可以考慮定義一系列多載版本:
您知道呼叫程式碼永遠不會將超過少量的值傳遞至參數陣列。
程式代碼中的邏輯會根據呼叫程式代碼所傳遞的值數量而明顯不同。
呼叫程式代碼可以傳遞不同數據類型的值。
何時使用參數陣列
在下列情況下,您最好使用 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
元素類型的一維陣列時,使用一個多載。對於每個正整數,當呼叫程式代碼提供該數目的自變數時,皆會針對每個
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 編譯程式選項,將類型檢查參數設定為 。 然後,您不需要宣告參數的數據類型。 不過,相較於重載,這個方法有以下缺點:
無類型程式設計會產生效率較低的執行程序代碼。
此程式必須測試它預期通過的每個數據類型。
如果呼叫程式代碼傳遞程式不支援的數據類型,編譯程式就無法發出錯誤訊號。