Dela via


Proceduröverlagring (Visual Basic)

Överlagring av en procedur innebär att definiera den i flera versioner, med samma namn men olika parameterlistor. Syftet med överlagring är att definiera flera nära relaterade versioner av en procedur utan att behöva särskilja dem efter namn. Det gör du genom att variera parameterlistan.

Regler för överlagring

När du överbelastar en procedur gäller följande regler:

  • Samma namn. Varje överbelastad version måste använda samma procedurnamn.

  • Annan signatur. Varje överbelastad version måste skilja sig från alla andra överlagrade versioner i minst något av följande avseenden:

    • Antal parametrar

    • Parametrarnas ordning

    • Datatyper för parametrarna

    • Antal typparametrar (för en allmän procedur)

    • Returtyp (endast för en konverteringsoperator)

    Tillsammans med procedurnamnet kallas de föregående objekten tillsammans för procedurens signatur . När du anropar en överbelastad procedur använder kompilatorn signaturen för att kontrollera att anropet matchar definitionen korrekt.

  • Objekt som inte är en del av signaturen. Du kan inte överbelasta en procedur utan att ändra signaturen. I synnerhet kan du inte överbelasta en procedur genom att bara variera ett eller flera av följande objekt:

    • Nyckelord för procedurmodifierare, till exempel Public, Sharedoch Static

    • Parameter- eller typparameternamn

    • Ange parameterbegränsningar (för en allmän procedur)

    • Nyckelord för parametermodifierare, till exempel ByRef och Optional

    • Om det returnerar ett värde

    • Datatypen för returvärdet (förutom en konverteringsoperator)

    Objekten i föregående lista ingår inte i signaturen. Även om du inte kan använda dem för att skilja mellan överlagrade versioner kan du variera dem mellan överlagrade versioner som är korrekt åtskilda av deras signaturer.

  • Argument med sen bindning. Om du tänker skicka en variabel för ett sent bundet objekt till en överbelastad version måste du deklarera lämplig parameter som Object.

Flera versioner av en procedur

Anta att du skriver en Sub procedur för att publicera en transaktion mot en kunds saldo och att du vill kunna referera till kunden antingen efter namn eller efter kontonummer. För att hantera detta kan du definiera två olika Sub procedurer, som i följande exempel:

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

Överlagrade versioner

Ett alternativ är att överbelasta ett enda procedurnamn. Du kan använda nyckelordet Overloads för att definiera en version av proceduren för varje parameterlista enligt följande:

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

Ytterligare överlagringar

Om du också vill acceptera ett transaktionsbelopp i antingen Decimal eller Singlekan du ytterligare överbelasta post för att tillåta den här varianten. Om du gjorde detta mot var och en av överlagringarna i föregående exempel skulle du ha fyra Sub procedurer, alla med samma namn men med fyra olika signaturer.

Fördelar med överlagring

Fördelen med att överbelasta en procedur ligger i anropets flexibilitet. Om du vill använda proceduren post som deklareras i föregående exempel kan den anropande koden hämta kundidentifieringen som antingen en String eller en Integeroch anropa sedan samma procedur i båda fallen. Följande exempel illustrerar detta:

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

Se även