Supraîncărcarea metodei Delphi și parametrii impliciti

Funcțiile și procedurile sunt o parte importantă a limbajului Delphi. Începând cu Delphi 4, Delphi ne permite să lucrăm cu funcții și proceduri care acceptă parametrii impliciti (devenind opțional parametrii) și permite ca două sau mai multe rutine să aibă un nume identic, dar să funcționeze ca rutine complet diferite.

Haideți să vedem modul în care parametrii de suprasarcină și implicit vă pot ajuta să codați mai bine.

supraîncărcarea

Mai simplu spus, supraîncărcarea declară mai multe rutine cu același nume. Supraîncărcarea ne permite să avem mai multe rutine care au același nume, dar cu un număr diferit de parametri și tipuri.

Ca exemplu, să luăm în considerare următoarele două funcții:

 Rutinele supraîncărcate trebuie declarate cu directiva de suprasarcină funcţie SumAsStr (a, b: număr întreg): şir; suprasarcină; începe    Rezultat: = IntToStr (a + b); Sfârșit; funcţie SumAsStr (a, b: extins; Cifre: întregi): şir; suprasarcină; începe    Rezultat: = FloatToStrF (a + b, ffFixed, 18, Cifre); Sfârșit; 

Aceste declarații creează două funcții, ambele numite SumAsStr, care au un număr diferit de parametri și sunt de două tipuri diferite. Când apelăm la o rutină supraîncărcată, compilatorul trebuie să poată spune ce rutină dorim să apelăm.

De exemplu, SumAsStr (6, 3) apelează prima funcție SumAsStr, deoarece argumentele sale sunt evaluate integral.

Notă: Delphi vă va ajuta să alegeți implementarea potrivită cu ajutorul completării codului și al informațiilor despre cod.

Pe de altă parte, luați în considerare dacă încercăm să apelăm funcția SumAsStr după cum urmează:

 SomeString: = SumAsStr (6.0,3.0) 

Vom primi o eroare care scrie: "nu există o versiune supraîncărcată a „SumAsStr” care să poată fi apelată cu aceste argumente."Acest lucru înseamnă că ar trebui să includem și parametrul Cifre folosit pentru a specifica numărul de cifre după punctul zecimal.

Notă: Există o singură regulă la scrierea rutinelor supraîncărcate și aceasta este aceea că o rutină supraîncărcată trebuie să difere în cel puțin un tip de parametru. În schimb, tipul de retur nu poate fi utilizat pentru a distinge între două rutine.

Două unități - O rutină

Să zicem că avem o rutină în unitatea A, iar unitatea B folosește unitatea A, dar declară o rutină cu același nume. Declarația din unitatea B nu are nevoie de directiva de suprasarcină - ar trebui să folosim numele unității A pentru a califica apelurile către versiunea A a rutinei de la unitatea B.

Luați în considerare ceva de genul:

 unitate B; ... utilizări A;… procedură RoutineName; începe   Rezultat: = A.RoutineName; Sfârșit; 

O alternativă la utilizarea rutinelor supraîncărcate este utilizarea parametrilor impliciti, care, de regulă, duce la mai puțin cod pentru a scrie și întreține.

Setări implicite / opționale

Pentru a simplifica unele afirmații, putem da o valoare implicită pentru parametrul unei funcții sau proceduri și putem apela rutina cu sau fără parametrul, făcând-o opțională. Pentru a furniza o valoare implicită, încheiați declarația de parametru cu simbolul egal (=) urmată de o expresie constantă.

De exemplu, având în vedere declarația

 funcţie SumAsStr (a, b: extins; Cifre: număr întreg = 2): şir; 

următoarele apeluri funcționale sunt echivalente.

 SumAsStr (6.0, 3.0) 
 SumAsStr (6.0, 3.0, 2) 

Notă: Parametrii cu valori implicite trebuie să apară la sfârșitul listei de parametri și trebuie trecuți ca valoare sau ca const. Un parametru de referință (var) nu poate avea o valoare implicită.

Când apelăm rutine cu mai mult de un parametru implicit, nu putem săriți parametrii (ca în VB):

 funcţie SkipDefParams (var Un șir; B: număr întreg = 5, C: boolean = Fals): boolean; ... // acest apel generează un mesaj de eroare CantBe: = SkipDefParams ('delphi', True); 

Supraîncărcarea cu parametrii implicite

Atunci când utilizați atât supraîncărcarea funcției, cât și a procedurilor și parametrii impliciti, nu introduceți declarații de rutină ambigue.

Luați în considerare următoarele declarații:

 procedură DoIt (A: extins; B: număr întreg = 0); suprasarcină; procedură DoIt (A: extins); suprasarcină; 

Apelul la procedura DoIt, cum ar fi DoIt (5.0), nu compilează. Din cauza parametrului implicit din prima procedură, această afirmație ar putea apela la ambele proceduri, deoarece este imposibil să se spună ce procedură este destinată.