Polimorfism (programare)

Polimorfismul (în limbile de programare) - capacitatea obiectelor cu aceeași specificație de a avea o implementare diferită.

O limbă de programare acceptă polimorfismul dacă clasele cu aceeași specificație pot avea o implementare diferită - de exemplu, o implementare de clasă poate fi schimbată în timpul moștenirii [1].







Pe scurt, sensul polimorfismului poate fi exprimat prin expresia: "O interfață, multe implementări".

Polimorfismul este unul dintre cele patru mecanisme cele mai importante ale programării orientate obiect (împreună cu abstractizarea, încapsularea și moștenirea).

Polimorfismul vă permite să scrieți programe mai abstracte și să creșteți coeficientul de reutilizare a codului. Proprietățile generale ale obiectelor sunt combinate într-un sistem, care poate fi numit în mod diferit - interfață, clasă. Comunitatea are o expresie externă și internă:

comunitatea externă se manifestă ca același set de metode cu aceleași nume și semnături (numele metodelor și tipurile de argumente și numărul acestora);

comunitatea interna - aceeași funcționalitate a metodelor. Acesta poate fi descris intuitiv sau exprimat sub forma unor legi stricte, reguli la care metodele trebuie să se supună. Capacitatea de a atribui diferite funcționalități unei metode (funcții, operații) se numește suprasolicitare a metodei (supraîncărcarea funcției, supraîncărcarea operațiilor).

O clasă de forme geometrice (elipsă, poligon) poate avea metode pentru transformări geometrice (deplasare, rotire, scalare).

Clasa thread-ului are metode pentru transferul de date seriale. Fluxul poate fi informația introdusă de utilizator de la terminal, schimbul de date printr-o rețea de calculatoare, un fișier (dacă este necesară procesarea secvențială a datelor, de exemplu, atunci când se analizează codul sursă al programului).







În limbile orientate pe obiecte

În limbile orientate pe obiecte, o clasă este un tip de date abstract. 1] Polimorfismul este implementat folosind moștenirea de clasă și funcțiile virtuale. Clasa copil moștenește semnăturile metodelor din clasa parentală, iar implementarea acestor metode, ca urmare a suprimării metodei, poate fi diferită, corespunzând specificului clasei copilului. Alte funcții pot funcționa cu obiectul ca și cu o instanță a clasei părinte, dar dacă obiectul este de fapt o instanță a clasei copil, atunci metoda suprascrisă în clasa descendentă va fi apelată în timpul rulării. Aceasta se numește legare târzie. [Un exemplu de utilizare poate fi lot de prelucrare, care cuprinde cazuri ca o clasă de clasa părinte și descendent: este evident că o astfel de matrice poate fi declarată numai ca o clasă părinte de tip matrice și obiectele matrice pot fi numite doar metode ale clasei, dar dacă clasa descendent a fost suprascrisă unele metode, instanțele de rulare ale acestei clase vor fi numite ele, și nu metodele de clasă părinte.]

Clasa copilă în sine poate fi părinte. Acest lucru vă permite să construiți scheme complexe de moștenire - copac sau în rețea.

Metodele abstract (sau pur virtual) nu au nicio implementare (de fapt, unele limbi, de exemplu C ++, permit implementarea metodelor abstracte în clasa parentală). Acestea sunt concepute special pentru moștenire. Implementarea lor trebuie definită în clasele descendente.

O clasă poate moșteni funcționalitatea din mai multe clase. Aceasta se numește moștenire multiplă. moștenire multiplă creează o problemă cunoscută (în C ++), atunci când o clasă moștenește de la mai mult de o clasă de intermediar, care la rândul său, a moștenit de la o clasă (așa-numita „problema diez“): în cazul în care metoda strămoș comun a fost înlocuită de intermediari, nu se cunoaște modul în care punerea în aplicare metoda trebuie să moștenească un descendent comun. Noi rezolva această problemă prin evitarea moștenire multiplă pentru clase și rezoluție multiplă moștenire pe deplin clase abstracte (de exemplu, interfețe) (C #, Delphi, Java), sau printr-o moștenire virtuală (C ++).

În limbile funcționale

Polimorfismul în limbile funcționale va fi luat în considerare utilizând exemplul lui Haskell.

În Haskell, există două tipuri de polimorfism - parametric (pur) și special (bazat pe clase [Nota 2]). O specială se numește și ad hoc (din latină ad hoc - special). Ele pot fi distinse după cum urmează:







Articole similare

Trimiteți-le prietenilor: