Overload della routine (Visual Basic)

Eseguire l'overload di una routine significa definirla in più versioni, usando lo stesso nome ma elenchi di parametri diversi. Lo scopo dell'overload è definire diverse versioni strettamente correlate di una routine senza doverle distinguere in base al nome. Questa operazione si esegue variando l'elenco di parametri.

Regole di overload

Quando si esegue l'overload di una routine, si applicano le regole seguenti:

  • Stesso nome. Ogni versione di overload deve usare lo stesso nome di routine.

  • Firma diversa. Ogni versione di overload deve essere diversa da tutte le altre versioni di overload in almeno uno dei seguenti aspetti:

    • Numero di parametri

    • Ordine dei parametri

    • Tipi di dati dei parametri

    • Numero dei parametri di tipo (per una routine generica)

    • Tipo restituito (solo per una routine di operatore di conversione)

    Insieme al nome della routine, gli elementi precedenti vengono denominati collettivamente firma della routine. Quando si chiama una routine di overload, il compilatore usa la firma per verificare che la chiamata corrisponda correttamente alla definizione.

  • Elementi non parte della firma. Non è possibile eseguire l'overload di una routine senza variare la firma. In particolare, non è possibile eseguire l'overload di una routine variando solo uno o più degli elementi seguenti:

    • Parole chiave di modificatori della routine (ad esempio Public, Shared e Static)

    • Nomi di parametri o di parametri di tipo

    • Vincoli definiti sui parametri di tipo (per una routine generica)

    • Parole chiave di modificatori di parametro (ad esempio ByRef o Optional)

    • Se restituisce un valore

    • Tipo di dati del valore restituito (ad eccezione di un operatore di conversione)

    Gli elementi nell'elenco precedente non fanno parte della firma. Anche se non è possibile usarli per distinguere le versioni di overload, è possibile variarli tra le versioni di overload correttamente differenziate in base alle relative firme.

  • Argomenti ad associazione tardiva. Se si intende passare una variabile oggetto con associazione tardiva a una versione di overload, è necessario dichiarare il parametro appropriato come Object.

Più versioni di una routine

Si supponga di scrivere una routine Sub per registrare una transazione rispetto al saldo di un cliente e di voler fare riferimento al cliente in base al nome o al numero di conto. Per soddisfare questa esigenza, è possibile definire due routine Sub diverse, come nell'esempio seguente:

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

Versioni di overload

Un'alternativa consiste nell'eseguire l'overload di un singolo nome di routine. È possibile usare la parola chiave Overloads per definire una versione della routine per ogni elenco di parametri, come indicato di seguito:

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

Overload aggiuntivi

Se si vuole anche accettare un importo della transazione in Decimal o Single, è possibile eseguire un ulteriore overload post per consentire questa variazione. Se si esegue questa operazione per ognuno degli overload nell'esempio precedente, si otterranno quattro routine Sub, tutte con lo stesso nome ma con quattro firme diverse.

Vantaggi dell'overload

Il vantaggio dell'overload di una routine sta nella flessibilità della chiamata. Per usare la routine post dichiarata nell'esempio precedente, il codice chiamante può ottenere l'ID del cliente come String o Integer, quindi chiamare la stessa routine in entrambi i casi. L'esempio seguente illustra questi concetti.

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

Vedi anche