Logo

Ep. 22 – OOP Part 6 (Polymorfizmus)

Objekt je polymorfický, keď je inštanciou viac ako jednej triedy. Vďaka polymorfizmu si vieme skrátiť a zjednodušiť kód, ale tak ako je to aj so všetkým ostatným, vieme si to aj poriadne skomplikovať.

Stiahnuť

00:00 – 02:00 Čo je to polymorfizmus
02:01 – 04:56 Príklad – muž a človek
04:57 – 06:48 Kedy je objekt polymorfický
06:49 – 15:45 Typy polymorfizmu (statický a dynamický)
15:46 – 19:35 Další príklad polymorfizmu
19:36 – 19:35 Výhody a nevýhody polymorfizmu
27:03 –  Zhrnutie a záver + pár užitočných tipov

Statický polymorfizmus

V Jave, ale aj v iných OOP jazykov vieme vytvoriť v triede viaceré metódy s tým istým názvom, dokonca aj s tou istou návratovou hodnotou, ale s inými parametrami.
Toto sa nazýva method overloading. Vieme to teda docieliť nasledujúcimi spôsobmi:

  • Iný počet parametrov 
  • Iné typy parametrov 
  • Iné poradie parametrov (neodporúča sa, neprehľadné API) 

Kedže metódy majú iné parametre, tak metódy majú tým pádom inú signature
Toto je statické, čiže compiler vie, ktorú metódu má v ktorom prípade použiť. 

Dynamický polymorfizmus

Táto forma polyformizmu nedovolí compileru dopredu vedieť, ktorú metódu bude treba zavolať. JVM (v pripade Javy) sa bude musieť rozhodnúť počas runtime. 

Dynamickž polymorfizmus sa dá dosiahnuť pomocou method overriding. A toto sa dá dosiahnut ako sme už aj spomínali: 

  • Podtrieda overridne metódu svojho parenta (obe metódy majú rovnakú signaturu ale poskytujú rôzne implementácie) 
  • Trieda ktorá implementuje nejaký interface, implementuje jeho metódy

Práve vďaka dynamickému polymorfizmu vieme robiťdivočiny”.  

Príklad

Abstraktná trieda Animal, ktorá obsahuje spoločné vlastnosti a chovania zvierať. Obsahuje metódu move(), ktorú musia deti tejto triedy implementovať.

abstract class Animal {
    String name;

    public Animal(String name) {
        this.name = name;
    }

    abstract void move();
}

Tri triedy (Horse, Bird, Fish), ktoré dedia od Animal. Každá implementuje metódu move() inak.

class Horse extends Animal {

    public Horse(String name) {
        super(name);
    }

    @Override
    void move() {
        System.out.println("Riding");
    }
}

class Bird extends Animal {

    public Bird(String name) {
        super(name);
    }

    @Override
    void move() {
        System.out.println("Flying");
    }
}

class Fish extends Animal {

    public Fish(String name) {
        super(name);
    }

    @Override
    void move() {
        System.out.println("Swimming");
    }
}

Výhodu polymorfizmu môžeme vidieť na nasledujúcom snippete. Trieda ZooService obsahuje metódu moveAnimal, ktorá má parameter typu Animal. Ja do tejto metódy môžem poslať ale všetky jej deti, resp hocijakého koňa, vtáka či ryby.

class ZooService {
    
    ...

    
    void moveAnimal(Animal animal) {
        animal.move();;
    }
}
...
Bird bird = new Animal("bird"); // Mozem vytvorit instanciu takto
Bird bird2 = new Bird("bird"); // Aj takto, je to jedno a to iste

Horse horse = new Horse("horse");
Fish fish = new Fish("fish");

zooService.move(bird); // vypise "Flying"
zooService.move(bird2); // vypise "Flying"
zooService.move(horse); // vypise "Riding"
zooService.move(bird); // vypise "Swimming"
...

 

 

Užitočné odkazy

Jakubova hra, ktorá učí základné koncepty OOP
Stará dobrá Wiki
OOP pre 6 ročných

Logo
Street of Code o.z.Hlaváčiková 2984105, Bratislava
Chcem odoberať novinky
Poskytnutím emailu súhlasíš s jeho spracovaním v súlade s GDPR.
Copyright © 2024 Street of Code
Kód tejto stránky si vieš pozrieť na našom GitHub-e