De ce este necesar polimorfismul fără a face acest lucru

Polimorfismul este tehnica utilizării mecanismului de legare și moștenire târzie.

Legarea ulterioară înseamnă că alegerea unui anumit tip de variabilă are loc în timpul funcționării programului și nu este specificată explicit de către programator.

De exemplu, scrieți un joc în care există o grădină și diferite tipuri de legume - morcovi, varză etc. Utilizatorul va planta aceste legume în ordine aleatorie, nu cunoașteți comanda la etapa de scriere a programului, astfel încât să nu puteți scrie ceva de genul:

carrot_obj-> creștere (); // cereți ca un morcov să crească

Există modalități diferite de a se întoarce și de a rezolva problema în această situație, dar cea mai concisă dintre ele este polimorfismul.

Legarea ulterioară îndeplinește definiția unui anumit tip (tip de legume) în stadiul de execuție, iar la etapa de compilare trebuie să asociați toate tipurile de legume cu un tip mai general. Prin urmare, polimorfismul este moștenirea + legarea ulterioară. Cea mai comună clasă

ar trebui să descrie interfața pentru toate legumele noastre:

intrarea virtuală int () = 0; // metodă de a forța o legumă abstractă să crească

Prin această interfață, atunci când folosim polimorfismul, ne adresăm clase de legume specifice (alegerea unei anumite clase se face automat în funcție de tipul de obiect care este ascuns în spatele acestei interfețe:

clasa Morcov. fructe publice

clasa de cartofi. fructe publice

În acest scenariu, grădina noastră ar trebui să conțină o listă de legume (abstract):

în timp ce în C ++ pentru a utiliza cu întârziere de legare, este necesar să se utilizeze indicii (sau indicii inteligente dacă nu suferă de pierderi de memorie), și în Java și C #, de exemplu, totul se face automat, ca se utilizează în mod obișnuit graiul pimpl (există întotdeauna indicii pretutindeni inteligente).

Să spunem că un utilizator trage un morcov în grădina lui. Cu acest nou morcov va fi creat (în nici un fel - am dat exemplul unui apel explicit la constructor, dar ar putea fi faptul că prototipul tip de model), și se adaugă la lista de legume.

Fructe * obj = nou Morcov ();

Apoi, alte legume ar putea fi adăugate la această listă într-un mod haotic, iar unele coduri au făcut o creștere a acestor legume cu o anumită frecvență:

pentru (i = 0; i În acest caz, dacă obiectul i-a al matricei de fructe a fost creat ca un morcov, va fi executat codul Carrot :: grow () și dacă cartofii :: cresc () ca cartofi. Programatorul nu are nevoie acum să se îmbăieze cu acest lucru, funcția tipului dorit va fi lansată automat în timpul rulării.

Sistemul a ales acest răspuns ca fiind cel mai bun

Articole similare