多載化程序的考慮因素 (Visual Basic)

當您多載某個程序時,您必須為每個多載版本使用不同的簽章。 這通常表示每個版本都必須指定不同的參數清單。 如需詳細資訊,請參閱程序多載中的<不同簽章>。

您可以使用 Sub 程序多載 Function 程序,反之亦然,但前提是它們有不同的簽章。 兩個多載之間的差異,不能只是一個有傳回值,而另一個沒有。

您可以使用相同的限制,用多載程序的方式來多載屬性。 不過,您無法使用屬性多載程序,反之亦然。

多載版本的替代方案

多載版本有時有替代方案,特別是有選擇性引數,或其數字為變數時。

請記住,並非所有語言都支援選擇性引數,而且參數陣列僅限於 Visual Basic。 如果您要撰寫的程序可能會在以數種不同程式設計語言撰寫的程式碼中呼叫,多載版本可提供最大的彈性。

多載和選擇性引數

當呼叫程式碼可選擇性提供或省略一或多個引數時,您可以定義多個多載版本或使用選擇性參數。

使用多載版本的時機

在下列情況下,您可以考慮定義一系列的多載版本:

  • 程序程式碼中的邏輯會根據呼叫程式碼是否提供選擇性引數而大為不同。

  • 程序程式碼無法以可靠的方式測試呼叫程式碼是否提供了選擇性引數。 例如,如果預設值沒有可能的候選項目,可能就不提供呼叫程式碼。

使用選擇性參數的時機

在下列情況下,您可能會偏好使用一或多個選擇性參數:

  • 當呼叫程式碼不提供選擇性引數時,唯一必要的動作是將參數設定為預設值。 在這種情況下,如果您使用一或多個 Optional 參數只定義一個版本,程序程式碼可能不會那麼複雜。

如需詳細資訊,請參閱參數

多載和 ParamArrays

當呼叫程式碼可以傳遞數目不定的引數時,您可以定義多個多載版本或使用參數陣列。

使用多載版本的時機

在下列情況下,您可以考慮定義一系列的多載版本:

  • 您知道呼叫程式碼傳遞至參數陣列的值個數,永遠不會超過某個不大的值。

  • 程序程式碼中的邏輯會根據呼叫程式碼傳遞的值個數而明顯不同。

  • 呼叫程式碼可以傳遞不同資料類型的值。

使用參數陣列的時機

在下列情況下,建議您最好使用 ParamArray 參數:

  • 您無法預測呼叫程式碼會傳遞多少個值到參數陣列,而這個數目可能很大。

  • 程序邏輯本身可逐一查看呼叫程式碼傳遞的所有值,基本會對每個值執行相同的作業。

如需詳細資訊,請參閱參數陣列

選擇性參數的隱含多載

具有選擇性參數的程序相當於兩個多載程序,一個有選擇性參數,另一個則沒有。 您無法使用對應至任一程序的參數清單多載這類程序。 下列宣告說明這一點。

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 元素類型時的一個多載

下列宣告說明這些隱含多載。

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)

無類型程式設計可為多載的替代方案

如果您想要允許呼叫程式碼將不同的資料類型傳遞至參數,您可以選擇使用無類型程式設計。 您可以使用 Option Strict 陳述式-optionstrict 編譯器選項,將類型檢查參數設為 Off。 然後,您就不需要宣告參數的資料類型。 不過,相較於多載,此方法有下列缺點:

  • 無類型程式設計會產生效率較低的執行程式碼。

  • 此程序必須測試預期要傳遞的每個資料類型。

  • 如果呼叫程式碼傳遞程序不支援的資料類型,編譯器就無法通知發生錯誤。

另請參閱