Udostępnij za pośrednictwem


Przeciążanie procedury (Visual Basic)

Przeciążenie procedury oznacza zdefiniowanie jej w wielu wersjach przy użyciu tej samej nazwy, ale różnych list parametrów. Celem przeciążenia jest zdefiniowanie kilku ściśle powiązanych wersji procedury bez konieczności rozróżniania ich według nazwy. Można to zrobić, zmieniając listę parametrów.

Przeciążanie reguł

Podczas przeciążenia procedury obowiązują następujące reguły:

  • Ta sama nazwa. Każda przeciążona wersja musi używać tej samej nazwy procedury.

  • Inny podpis. Każda przeciążona wersja musi się różnić od wszystkich innych przeciążonych wersji w co najmniej jednej z następujących kwestii:

    • Liczba parametrów

    • Kolejność parametrów

    • Typy danych parametrów

    • Liczba parametrów typu (dla procedury ogólnej)

    • Zwracany typ (tylko dla operatora konwersji)

    Wraz z nazwą procedury powyższe elementy są zbiorczo nazywane podpisem procedury. Podczas wywoływania przeciążonej procedury kompilator używa podpisu, aby sprawdzić, czy wywołanie jest poprawnie zgodne z definicją.

  • Elementy nie są częścią podpisu. Nie można przeciążyć procedury bez zmiany podpisu. W szczególności nie można przeciążyć procedury, zmieniając tylko jeden lub więcej następujących elementów:

    • Słowa kluczowe modyfikatora procedury, takie jak Public, Sharedi Static

    • Nazwy parametrów lub typów

    • Ograniczenia parametrów typu (dla procedury ogólnej)

    • Słowa kluczowe modyfikatora parametrów, takie jak ByRef i Optional

    • Czy zwraca wartość

    • Typ danych zwracanej wartości (z wyjątkiem operatora konwersji)

    Elementy na powyższej liście nie są częścią podpisu. Chociaż nie można ich używać do rozróżniania przeciążonych wersji, można je różnić w zależności od przeciążonych wersji, które są prawidłowo rozróżniane przez ich sygnatury.

  • Argumenty związane z późnym opóźnieniem. Jeśli zamierzasz przekazać zmienną obiektu z późną granicą do przeciążonej wersji, należy zadeklarować odpowiedni parametr jako Object.

Wiele wersji procedury

Załóżmy, że piszesz procedurę Sub publikowania transakcji względem salda klienta i chcesz mieć możliwość odwoływania się do klienta według nazwy lub numeru konta. Aby to uwzględnić, można zdefiniować dwie różne Sub procedury, jak w poniższym przykładzie:

Sub postName(ByVal custName As String, ByVal amount As Single)
    ' Insert code to access customer record by customer name.
End Sub
Sub postAcct(ByVal custAcct As Integer, ByVal amount As Single)
    ' Insert code to access customer record by account number.
End Sub

Wersje przeciążone

Alternatywą jest przeciążenie pojedynczej nazwy procedury. Możesz użyć słowa kluczowego Przeciążenia, aby zdefiniować wersję procedury dla każdej listy parametrów w następujący sposób:

Overloads Sub post(ByVal custName As String, ByVal amount As Single)
    ' Insert code to access customer record by customer name.
End Sub
Overloads Sub post(ByVal custAcct As Integer, ByVal amount As Single)
    ' Insert code to access customer record by account number.
End Sub

Dodatkowe przeciążenia

Jeśli chcesz również zaakceptować kwotę transakcji w elemecie Decimal lub Single, możesz jeszcze bardziej przeciążyć post , aby zezwolić na tę odmianę. Jeśli wykonasz to do każdego przeciążenia w poprzednim przykładzie, będziesz mieć cztery Sub procedury, wszystkie o tej samej nazwie, ale z czterema różnymi podpisami.

Zalety przeciążenia

Zaletą przeciążenia procedury jest elastyczność wywołania. Aby użyć post procedury zadeklarowanej w poprzednim przykładzie, kod wywołujący może uzyskać identyfikację klienta jako String element lub Integer, a następnie wywołać tę samą procedurę w obu przypadkach. Zostało to przedstawione w poniższym przykładzie:

Imports MSVB = Microsoft.VisualBasic
Dim customer As String
Dim accountNum As Integer
Dim amount As Single
customer = MSVB.Interaction.InputBox("Enter customer name or number")
amount = MSVB.Interaction.InputBox("Enter transaction amount")
Try
    accountNum = CInt(customer)
    Call post(accountNum, amount)
Catch
    Call post(customer, amount)
End Try

Zobacz też