OOP Concepte pentru Incepatori: Ce este Polimorfismul

OOP Concepte pentru Incepatori: Ce este Polimorfismul

cuvântul polimorfismul este folosit în diferite contexte și descrie situații în care ceva apare în mai multe forme diferite. În informatică, descrie conceptul că obiectele de diferite tipuri pot fi accesate prin aceeași interfață. Fiecare tip poate oferi propria implementare independentă a acestei interfețe. Este unul dintre conceptele de bază ale programării orientate pe obiecte (OOP).,dacă vă întrebați dacă un obiect este polimorf, puteți efectua un test simplu. Dacă obiectul trece cu succes mai multe teste is-a sau instanceof, este polimorf. Așa cum am descris în postarea mea despre moștenire, toate clasele Java extind obiectul clasei. Datorită acestui fapt, toate obiectele din Java sunt polimorfe, deoarece trec cel puțin două verificări instanceof.,Java suportă 2 tipuri de polimorfism:

  • static sau compile-time
  • dinamic

polimorfism Static

Java, la fel ca multe alte limbaje de programare orientate pe obiecte, vă permite să implementați mai multe metode în cadrul aceleiași clase care utilizează același nume, dar un set diferit de parametri. Aceasta se numește supraîncărcare metodă și reprezintă o formă statică de polimorfism.,seturile de parametri trebuie să difere în cel puțin unul dintre următoarele trei criterii:

  • ei trebuie să aibă un număr diferit de parametri, de exemplu, o metodă acceptă 2 și altul 3 parametri.
  • tipurile de parametri trebuie să fie diferite, de exemplu, o metodă acceptă un șir și un altul Un lung.
  • ei trebuie să se aștepte parametrii într-o ordine diferită, de exemplu, o metodă acceptă un șir și un lung și un altul acceptă un lung și un șir. Acest tip de supraîncărcare nu este recomandat, deoarece face API dificil de înțeles.,în majoritatea cazurilor, fiecare dintre aceste metode supraîncărcate oferă o funcționalitate diferită, dar foarte similară.datorită diferitelor seturi de parametri, fiecare metodă are o semnătură diferită. Acest lucru permite compilatorului să identifice ce metodă trebuie apelată și să o lege de apelul metodei. Această abordare se numește legare statică sau polimorfism static.

    Să aruncăm o privire la un exemplu.

    un exemplu simplu pentru polimorfismul static

    folosesc același proiect CoffeeMachine pe care l-am folosit în postările anterioare ale acestei serii. Puteți să-l clona la https://github.com/thjanssen/Stackify-OopInheritance.,

    clasa BasicCoffeeMachine implementează două metode cu numele brewCoffee. Primul acceptă un parametru de cafea de tipselecție. Cealaltă metodă acceptă doi parametri, o Cafeaeselecție și un int.

    acum, când apelați una dintre aceste metode, setul de parametri furnizat identifică metoda care trebuie apelată.

    în următorul fragment de cod, numesc metoda numai cu un obiect CoffeeSelection. La momentul compilării, compilatorul Java leagă această metodă de apel la metoda brewCoffee (CoffeeSelection selection).,

    BasicCoffeeMachine coffeeMachine = createCoffeeMachine();coffeeMachine.brewCoffee(CoffeeSelection.FILTER_COFFEE);

    Dacă am schimba prezentul cod și de apel brewCoffee metodă cu un CoffeeSelection obiect și un int, compilatorul se leagă metoda apela la alte brewCoffee(CoffeeSelection selecție, int numar) metodă.

    polimorfism dinamic

    această formă de polimorfism nu permite compilatorului să determine metoda executată. JVM trebuie să facă asta în timpul rulării.

    în cadrul unei ierarhii de moștenire, o subclasă poate înlocui o metodă a superclasei sale. Aceasta permite dezvoltatorului subclasei să personalizeze sau să înlocuiască complet comportamentul acelei metode.,de asemenea, creează o formă de polimorfism. Ambele metode, implementate de super – și subclasa, au același nume și parametri, dar oferă funcționalități diferite.să aruncăm o privire la un alt exemplu din proiectul CoffeeMachine.

    Metoda imperativ într-o ierarhie de moștenire

    BasicCoffeeMachine clasa a este superclasa a PremiumCoffeeMachine clasa.ambele clase oferă o implementare a metodei brewCoffee (CoffeeSelection selection).,dacă citiți postarea despre moștenirea conceptului OOP, cunoașteți deja cele două implementări ale metodei brewCoffee. BasicCoffeeMachine acceptă numai Cafeaeselection.FILTER_COFFEE. Metoda brewCoffee din clasa PremiumCoffeeMachine adaugă suport pentru CoffeeSelection.ESPRESSO. Dacă este apelat cu orice altă CoffeeSelection, folosește cuvântul cheie super pentru a delega apelul la superclasă.,când doriți să utilizați o astfel de ierarhie de moștenire în proiectul dvs., trebuie să puteți răspunde la următoarea întrebare: ce metodă va apela JVM?

    la care se poate răspunde doar în timpul rulării, deoarece depinde de obiectul pe care se apelează metoda. Tipul de referință, pe care îl puteți vedea în codul dvs., este irelevant. Trebuie să distingi trei scenarii generale:

    1. obiectul tău este de tipul superclasei și se face referire ca superclasa., Deci, în exemplul acestui post, un obiect BasicCoffeeMachine devine referit ca un BasicCoffeeMachine.
    2. obiectul dvs. este de tipul subclasei și se face referire ca subclasă. În exemplul acestui post, un obiect PremiumCoffeeMachine se face referire ca PremiumCoffeeMachine.
    3. obiectul dvs. este de tipul subclasei și se face referire ca superclasa. În exemplul CoffeeMachine, un obiect PremiumCoffeeMachine se face referire ca un BasicCoffeeMachine.
    superclasa la care se face referire ca superclasa

    primul scenariu este destul de simplu., Atunci când instantia un BasicCoffeeMachine obiect și depozitați-l într-o variabilă de tip BasicCoffeeMachine, JVM va apela brewCoffee metoda pe BasicCoffeeMachine clasa. Deci, puteți prepara doar o Cafeaselecție.FILTER_COFFEE.

    subclasa la care se face referire ca subclasa

    al doilea scenariu este similar. Dar de data asta, am instantia un PremiumCoffeeMachine și de referință ca un PremiumCoffeeMachine. În acest caz, JVM numește metoda brewCoffee din clasa PremiumCoffeeMachine, care adaugă suport pentru CoffeeSelection.ESPRESSO.,

    subclasa menționată ca superclasa

    acesta este cel mai interesant scenariu și principalul motiv pentru care explic polimorfismul dinamic în astfel de detalii.

    atunci Când instantia un PremiumCoffeeMachine obiect și atribuiți-l la BasicCoffeeMachine coffeeMachine variabilă, este încă o PremiumCoffeeMachine obiect. Arată ca o mașină de bază.

    compilatorul nu vede acest lucru în cod și puteți utiliza numai metodele furnizate de clasa BasicCoffeeMachine., Dar dacă suni la brewCoffee metoda pe coffeeMachine variabilă, JVM știe că acesta este un obiect de tip PremiumCoffeeMachine și execută metoda anulată. Aceasta se numește legare târzie.

    rezumat

    polimorfismul este unul dintre conceptele de bază în limbajele OOP. Acesta descrie conceptul că diferite clase pot fi utilizate cu aceeași interfață. Fiecare dintre aceste clase poate oferi propria implementare a interfeței.Java suportă două tipuri de polimorfism. Puteți supraîncărca o metodă cu diferite seturi de parametri., Aceasta se numește polimorfism static, deoarece compilatorul leagă static apelul metodei la o metodă specifică.

    în cadrul unei ierarhii de moștenire, o subclasă poate înlocui o metodă a superclasei sale. Dacă instanțiați subclasa, JVM va apela întotdeauna metoda suprascrisă, chiar dacă aruncați subclasa în superclasa sa. Asta se numește polimorfism dinamic.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *