Metode de supraîncărcare

Metode de supraîncărcare

Cartea este concepută pentru o gamă largă de cititori interesați de programarea în C # Introduceți aici o scurtă adnotare

Carte: C # 4.0: Ghidul complet

Metode de supraîncărcare

În C #, puteți partaja același nume cu două sau mai multe metode din aceeași clasă, cu condiția ca parametrii săi să fie declarați diferit. În acest caz, ei spun că metodele sunt supraîncărcate. iar procesul în sine se numește metode de supraîncărcare. Metodele de suprasarcină se referă la una dintre modalitățile de implementare a polimorfismului în C #.







În general, pentru a supraîncărca metoda, este suficient să se declare diferitele sale variante, iar restul va fi preluat de compilator. Dar este necesar să se respecte următoarea condiție importantă: tipul sau numărul de parametri pentru fiecare metodă trebuie să fie diferit. Nu este suficient ca cele două metode să difere numai în ceea ce privește tipurile de valori returnate. De asemenea, acestea ar trebui să difere în funcție de tipurile sau numărul parametrilor acestora. (În orice caz, tipul de retur nu oferă suficiente informații compilatorului C # pentru a decide ce metodă să utilizeze.) Desigur, metodele supraîncărcate pot diferi și în tipurile de valori returnate. Când se invocă o metodă supraîncărcată, se execută varianta a cărei parametri corespund (după tip și număr) cu argumentele transmise.

Mai jos este un exemplu simplu care arată metodele de supraîncărcare.

Acesta este rezultatul executării codului de mai sus.

Fără parametri
Un parametru: 2
Doi parametri: 4 6
Rezultatul apelării metodei ob.OvlDemo (4, 6): 10
Doi parametri de tipul double: 1.1 2.32
Rezultatul apelării metodei ob.OvlDemo (1.1, 2.32): 3.42

După cum puteți vedea, metoda OvlDemo () este supraîncărcată de patru ori. Prima variantă nu primește parametri, al doilea primește un parametru întreg, al treilea - doi parametri întregi și al patrulea - doi parametri de tip dublu. Rețineți, de asemenea, că primele două versiuni ale metodei OvlDemo () returnează o valoare de tip void. dar, în esență, nu returnează nici o valoare, iar celelalte două - returnează o valoare specifică. Și acest lucru este perfect permis, dar, așa cum sa explicat mai sus, tipul de returnare nu joacă nici un rol în suprasolicitarea metodei. Prin urmare, încercarea de a utiliza două variante diferite (cu tipul de retur) ale metodei OvlDemo () din fragmentul de cod de mai jos va duce la o eroare.

Și așa cum este explicat în Capitolul 3, C # oferă o serie de conversii de tip implicit (de exemplu, automate). Aceste transformări se aplică și parametrilor metodelor supraîncărcate. De exemplu, luați în considerare următorul program.

Acest program produce următorul rezultat.

În acest exemplu, doar două variante ale metodei MyMeth () sunt definite. cu un parametru de tip int și cu un parametru de tip dublu. Cu toate acestea, puteți trece o valoare de octet tip, scurt sau float în metoda MyMeth (). Deci, dacă această metodă este trecută printr-o valoare de tip octet sau scurt, compilatorul C # convertește automat această valoare în int și în cele din urmă apelează metoda MyMeth (int) a acestei metode. Și dacă trece o valoare de tip float. atunci este convertită la un tip dublu și, ca rezultat, se numește metoda MyMeth (metoda dublă) a acestei metode.







Cu toate acestea, trebuie reținut că conversiile de tip implicit sunt efectuate numai dacă nu există o potrivire exactă între tipurile parametrului și argument. De exemplu, mai jos este o versiune ușor modificată a programului anterior, în care se adaugă o variantă a metodei MyMeth (), unde este specificat un parametru al tipului de octet.

Execuția acestui program duce la următorul rezultat.

În acest program, există o variantă a metodei MyMeth (), care ia un argument al tipului de octet, deci când apelați această metodă cu un argument de tip octet, varianta sa MyMeth (octet) este selectată fără o conversie automată la int.

Ambii modificatori de parametri, ref și out, sunt de asemenea luați în considerare atunci când se ia o decizie de supraîncărcare a metodei. De exemplu, mai jos este un fragment de cod în care sunt definite două metode complet diferite.

Prin urmare, atunci când se face referire

Se numește metoda MyMeth (int x), dar când se accesează

se numește metoda MyMeth (ref int x).

Deși se iau în considerare modificatorii parametrilor ref și out, atunci când se ia decizia de supraîncărcare a metodei, diferența dintre ele nu este atât de semnificativă. De exemplu, următoarele două variante ale metodei MyMeth () sunt nevalide.

În acest caz, compilatorul nu poate distinge două versiuni ale aceleiași metode MyMeth () numai pe baza faptului că unul dintre ele folosește parametrul out. și parametrul ref în celălalt.

Supraîncărcarea metodelor susține proprietatea polimorfismului, deoarece în acest fel în C # principiul principal al polimorfismului este realizat: o interfață - multe metode. Pentru a deveni mai clară cum se face acest lucru, să ne îndreptăm spre un exemplu concret. În limbile de programare care nu acceptă suprasolicitarea metodei, fiecare metodă trebuie să aibă un nume unic. Dar, în programare, este adesea nevoie să se implementeze în mod esențial aceeași metodă pentru prelucrarea diferitelor tipuri de date. Să presupunem că avem nevoie de o funcție care determină valoarea absolută. În limbile care nu acceptă suprasolicitarea metodelor, este de obicei necesar să se creeze trei sau mai multe variante ale unei astfel de funcții cu nume puțin diferite, dar totuși diferite. De exemplu, în C, funcția abs () returnează valoarea absolută a unui întreg, laboratoarele () reprezintă valoarea absolută a unui întreg lung, iar funcția fabs () este valoarea absolută a unui număr de punct floating cu o singură precizie.

În C, supraîncărcarea nu este suportată și, prin urmare, fiecare funcție trebuie să aibă propriul nume, chiar dacă toate funcțiile de mai sus fac în mod esențial același lucru - defini valoarea absolută. Dar acest lucru complică fundamental situația, deoarece trebuie să vă amintiți numele tuturor celor trei funcții, deși acestea sunt implementate pe același principiu de bază. Probleme similare în C # nu apar, deoarece fiecare metodă care definește o valoare absolută poate fi atribuită aceluiași nume. Într-adevăr, biblioteca de clasă pentru .NET Framework include metoda Abs (), care este supraîncărcată în clasa System.Math pentru prelucrarea datelor de diferite tipuri numerice. Compilaterul C # determină ce versiune a metodei Abs () ar trebui să fie apelată, pe baza tipului de argument transmis.

Valoarea principală a supraîncărcării este că oferă acces la metodele aferente prin nume comun. Prin urmare, numele Abs desemnează acțiunea generală care trebuie efectuată, iar compilatorul alege o anumită variantă a metodei de circumstanțe. Datorită polimorfismului, mai multe nume sunt reduse la unul. În ciuda simplității exemplului considerat aici, principiul polimorfismului demonstrat în el poate fi extins pentru a afla cum supraîncărcarea ajută la rezolvarea situațiilor de programare mult mai complexe.

Când o metodă este supraîncărcată, fiecare dintre variantele sale poate efectua orice acțiune. Pentru a stabili relația dintre metodele supraîncărcate, nu există o regulă, dar din punctul de vedere al unui stil de programare adecvat, metodele de supraîncărcare implică o relație similară. Prin urmare, nu este necesar să se utilizeze același nume pentru metode independente, deși acest lucru este posibil. De exemplu, numele Sqr ar putea fi aleasă pentru metodele care returnează pătratul și rădăcina pătrată a unui număr cu virgulă mobilă. Dar acestea sunt operațiuni fundamental diferite. O astfel de aplicare a metodelor de supraîncărcare este contrară scopului său inițial. În practică, numai operațiunile strâns legate trebuie supraîncărcate.

C # definește conceptul de semnătură. numele metodei și o listă a parametrilor săi; În ceea ce privește supraîncărcarea, acest concept înseamnă că într-o clasă nu ar trebui să existe două metode cu aceeași semnătură. Trebuie subliniat că semnătura nu include tipul valorii returnate, deoarece nu este luată în considerare atunci când compilatorul C # ia o decizie cu privire la supraîncărcarea metodei. Modificatorul de paramuri nu este, de asemenea, inclus în semnătura.







Articole similare

Trimiteți-le prietenilor: