Le funzioni e le procedure sono una parte importante del linguaggio Delphi. A partire da Delphi 4, Delphi ci consente di lavorare con funzioni e procedure che supportano i parametri predefiniti (rendendo i parametri opzionali) e consente a due o più routine di avere un nome identico ma funzionano come routine completamente diverse.
Vediamo come il sovraccarico e i parametri predefiniti possono aiutarti a programmare meglio.
In parole povere, il sovraccarico sta dichiarando più di una routine con lo stesso nome. Il sovraccarico ci consente di avere più routine che condividono lo stesso nome, ma con un numero diverso di parametri e tipi.
Ad esempio, consideriamo le due seguenti funzioni:
Le routine di sovraccarico devono essere dichiarate con la direttiva di sovraccarico funzione SumAsStr (a, b: intero): corda; sovraccarico; inizio Risultato: = IntToStr (a + b); fine; funzione SumAsStr (a, b: esteso; Cifre: intero): corda; sovraccarico; inizio Risultato: = FloatToStrF (a + b, ffFixed, 18, Digits); fine;
Queste dichiarazioni creano due funzioni, entrambe chiamate SumAsStr, che accettano un numero diverso di parametri e sono di due tipi diversi. Quando chiamiamo una routine sovraccarica, il compilatore deve essere in grado di dire quale routine vogliamo chiamare.
Ad esempio, SumAsStr (6, 3) chiama la prima funzione SumAsStr, poiché i suoi argomenti sono valutati in numeri interi.
Nota: Delphi ti aiuterà a scegliere l'implementazione giusta con l'aiuto del completamento del codice e della comprensione del codice.
D'altra parte, considera se proviamo a chiamare la funzione SumAsStr come segue:
SomeString: = SumAsStr (6.0,3.0)
Verrà visualizzato un errore che dice: "non esiste una versione sovraccarica di 'SumAsStr' che può essere chiamata con questi argomenti."Ciò significa che dovremmo includere anche il parametro Digits utilizzato per specificare il numero di cifre dopo il punto decimale.
Nota: Esiste una sola regola durante la scrittura di routine sovraccaricate, ovvero una routine sovraccaricata deve differire in almeno un tipo di parametro. Il tipo restituito, invece, non può essere utilizzato per distinguere tra due routine.
Diciamo che abbiamo una routine nell'unità A, e l'unità B usa l'unità A, ma dichiara una routine con lo stesso nome. La dichiarazione nell'unità B non richiede la direttiva di sovraccarico: dovremmo usare il nome dell'unità A per qualificare le chiamate alla versione A della routine dall'unità B.
Prendi in considerazione qualcosa del genere:
unità B; ... usi UN;… procedura RoutineName; inizio Risultato: = A.RoutineName; fine;
Un'alternativa all'utilizzo di routine sovraccaricate consiste nell'utilizzare i parametri predefiniti, che di solito si traducono in meno codice da scrivere e mantenere.
Per semplificare alcune istruzioni, possiamo fornire un valore predefinito per il parametro di una funzione o procedura e possiamo chiamare la routine con o senza il parametro, rendendolo facoltativo. Per fornire un valore predefinito, terminare la dichiarazione del parametro con il simbolo uguale (=) seguito da un'espressione costante.
Ad esempio, data la dichiarazione
funzione SumAsStr (a, b: esteso; Cifre: intero = 2): corda;
le seguenti chiamate di funzione sono equivalenti.
SumAsStr (6.0, 3.0)
SumAsStr (6.0, 3.0, 2)
Nota: I parametri con valori predefiniti devono essere presenti alla fine dell'elenco dei parametri e devono essere passati per valore o come const. Un parametro di riferimento (var) non può avere un valore predefinito.
Quando si chiamano routine con più di un parametro predefinito, non è possibile saltare i parametri (come in VB):
funzione SkipDefParams (var Una stringa; B: intero = 5, C: booleano = Falso): booleano;… // questa chiamata genera un messaggio di errore CantBe: = SkipDefParams ('delphi',, True);
Quando si utilizzano sia il sovraccarico della funzione o della procedura sia i parametri predefiniti, non introdurre dichiarazioni di routine ambigue.
Considera le seguenti dichiarazioni:
procedura DoIt (A: esteso; B: intero = 0); sovraccarico; procedura DoIt (A: esteso); sovraccarico;
La procedura di chiamata a DoIt come DoIt (5.0) non viene compilata. A causa del parametro predefinito nella prima procedura, questa istruzione potrebbe richiamare entrambe le procedure, poiché è impossibile stabilire quale procedura debba essere chiamata.