Supraîncărcarea procedurilor și funcțiilor - capacitatea de a utiliza subrutine cu același nume: proceduri sau funcții în limbaje de programare.
În majoritatea limbajelor de programare timpurii, pentru a simplifica procesul de traducere, a existat o restricție conform căreia nu mai mult de o procedură cu același nume ar putea fi disponibilă într-un program în același timp. Conform acestei restricții, toate subrutinele vizibile la un punct dat din program trebuie să aibă nume diferite.
Numele și denumirile procedurilor și funcțiilor care fac parte din limbajul de programare nu pot fi folosite de programator pentru a-și denumi propriile subrutine.
Pentru a putea folosi mai multe variante ale unei subrutine cu același nume, dar cu un număr diferit de argumente sau alte tipuri de argumente (adică cu o semnătură diferită , deoarece lista de argumente face parte din semnătură), subrutina se introduce suprasolicitarea. O astfel de supraîncărcare este posibilă în cadrul paradigmei procedurale , fără utilizarea programării orientate pe obiecte.
În timpul traducerii, procedurile și funcțiile cu același nume sunt controlate astfel încât să difere în semnătură, deoarece în acest caz traducătorul poate determina în mod unic apelul către subrutina dorită.
Pentru a elimina greșeala unui programator care a dat accidental un nume unei subrutine care este deja în uz, se introduce o cerință suplimentară de a scrie un cuvânt cheie. Acest lucru se face, de exemplu, în limba Delphi (cuvântul cheie de supraîncărcare).
Funcțiile supraîncărcate au același nume, dar numere sau tipuri diferite de argumente. Acesta este un fel de polimorfism static , în care întrebarea ce funcție să apeleze este decisă de lista argumentelor sale. Această abordare este folosită în limbaje tipizate static , care verifică tipurile de argumente atunci când apelează o funcție. O funcție supraîncărcată este de fapt mai multe funcții diferite, iar alegerea celei potrivite are loc în timpul compilării. Supraîncărcarea funcțiilor nu trebuie confundată cu formele de polimorfism în care metoda corectă este aleasă în timpul rulării, cum ar fi prin funcții virtuale, mai degrabă decât static.
Exemplu: supraîncărcările de funcții în C++
principal () { cout << volum ( 10 ); cout << volum ( 2,5 , 8 ); cout << volum ( 100 , 75 , 15 ); } // volumul unui cub int volum ( int s ) { returnare ( s * s * s ); } // volumul unui cilindru volum dublu ( dublu r , int h ) { întoarcere ( 3,14 * r * r * h ); } // volumul unui cuboid volum lung ( long l , int b , int h ) { întoarcere ( l * b * h ); }În exemplul de mai sus, volumul diferitelor componente este calculat folosind apeluri la diferite funcții „volum” cu argumente care diferă în tipul sau cantitatea de date.
Exemplu: supraîncărcări de funcții în limbajul Nim.
supraîncărcare proc ( x : int ) = echo "string int" supraîncărcare proc ( x : float ) = ecou "float șir" supraîncărcare ( 1 ) # va tipări „string int” supraîncărcare ( 1.1 ) # va tipări „string float”Constructorii utilizați pentru a instanția obiecte pot fi, de asemenea, supraîncărcați în unele limbaje de programare orientate pe obiecte. Deoarece în multe limbi numele constructorului este predefinit de numele clasei, s-ar părea că poate exista un singur constructor. Ori de câte ori sunt necesari mai mulți constructori, aceștia sunt implementați ca funcții supraîncărcate. Constructorul implicit nu acceptă parametri, instanța obiectului ia membri nuli. [ 1 ] De exemplu, constructorul implicit pentru un obiect factura dintr-un restaurant scris în C++ ar putea seta Tip la 15%:
factura () { pont = 15,0 ; total = 0,0 ; }Dezavantajul este că este nevoie de doi pași pentru a schimba valoarea obiectului Bill creat. Următoarele arată crearea și modificarea valorilor în cadrul programului principal:
Bill cafe ; cafenea . bacsis = 10,00 ; cafenea . total = 4,00 ;Prin supraîncărcarea constructorului, ar fi posibil să trecem un sfat și calitatea generală a parametrilor în timpul creării. Exemplul arată un constructor supraîncărcat cu doi parametri:
Bill ( dublu setTip , double setTotal ) { tip = set Tip ; total = setTotal ; }Acum, funcția care creează noul obiect Bill poate transmite două valori constructorului și poate seta membrii datelor într-un singur pas. Următoarele arată cum să creați și să setați valori:
Bill cafe ( 10.00 , 4.00 );Acest lucru poate fi util pentru a face programele mai eficiente și pentru a reduce dimensiunea codului.
Supraîncărcarea unei proceduri sau a unei funcții de mai multe ori poate face dificilă pentru dezvoltatori să știe ce supraîncărcare este utilizată în ce moment.
Posibilitatea de supraîncărcare a numelor de proceduri și funcții din program este determinată de capacitățile de analizare ale compilatorului și de cerințele standardului limbajului pentru scrierea acestora. Analiza sintactică constă în potrivirea apelului unei funcții supraîncărcate cu o anumită funcție (cu o anumită semnătură) și nu afectează consumul de resurse al programului și timpul de execuție al acestuia.
Dimensiunea codului de program compilat atunci când se folosește o supraîncărcare a funcției în loc de o funcție cu un număr arbitrar de argumente crește (în loc de o procedură cu un număr variabil de argumente, mai multe sunt compilate pentru un anumit număr), dar, în schimb, performanța programului crește la apelarea unei proceduri care este descrisă ca fiind supraîncărcată (nu se efectuează nicio analiză de tip și alte operații de calcul în timpul execuției programului). Deci, de exemplu, în biblioteca C++ STL, funcțiile utilizate frecvent cu un număr variabil de argumente sunt înlocuite cu supraîncărcări.