polimorfizm pytanie rekrutacyjne

Polimorfizm

Polimorfizm z języka greckiego oznacza wiele form. Jest to popularny termin w biologii, gdzie osobniki pewnego gatunek pomimo cech wspólnych są różnymi osobnikami. Podobnie jest w świecie programowania. Istnieje element bazowy, który opisuje jak cała grupa ma się zachowywać tzn. definiuje metody, jakie są dostępne dla elementów tego typu, jednak pomija ich implementację.

Teraz czas przekuć powyższy wywód teoretyczny bardziej na język programistyczny. W języku Java aby wykorzystać mechanizm polimorfizmu musimy wykorzystać dziedziczenie lub zaimplementować interfejs. To właśnie klasa lub interfejs bazowy definiują jedynie jak będzie zachowywał się nasz gatunek (typ), a dopiero dzieci znają dokładną implementację zachowań. Każdy z podtypów będzie posiadał inną implementację tzn. inaczej będzie wykonywał te same czynności niż inny podtyp.

Ważną zaletą polimorfizmu jest to, że każdy podtyp możemy przypisać do typu bazowego. Dzięki temu wiemy, że każdy z podtypów wykonuje te same czynności, tylko inaczej.

Sloganowym przykładem polimorfizmu jest dziedziczenie po klasie bazowej Figura.

public class Main {
    class Punkt {
        int x;
        int y;
    }

    static abstract class Figura {
        abstract void narysuj();
    }

    static class Trojkat extends Figura {
        Punkt a;
        Punkt b;
        Punkt c;

        @Override
        void narysuj() {
            // narysuj trojkat
        }
    }

    static class Kwadrat extends Figura {
        Punkt a;
        Punkt b;
        Punkt c;
        Punkt d;

        @Override
        void narysuj() {
            // narysuj kwadrat
        }
    }

    public static void main(String[] args) {
        Figura trojkat = new Trojkat();

        Figura kwadrat = new Kwadrat();

        trojkat.narysuj();
        kwadrat.narysuj();
    }
}

Klasa Figura definiuje jedynie jakie metody powinna zawierać każda z figur, dopiero każda z figur posiada odpowiednią implementację metody narysuj (kwadrat i trójkąt zostaną narysowane inaczej).

Warto również zauważyć, że pola w klasach również się różnią – polimorfizm nie określa co obiekt powinien posiadać, jedynie co powinien robić.

Obiekty typu Trojkat oraz Kwadrat możemy przypisać do typu Figura. Dzięki temu np. możemy przechowywać je w jednej kolekcji mając pewność, że posiadają one wspólne cechy.

 

Kamil Klimek

Od 2016 jestem programistą Java. Przez pierwsze 4 lata pracowałem jako Full Stack Java Developer. Później postanowiłem postawić nacisk na Javę, żeby jeszcze lepiej ją poznać.

Subscribe
Powiadom o
guest
3 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments
Paweł
Paweł
2 lat temu

Cześć! Super odpowiedź. Brakuje tylko jednej rzeczy. Co, jeśli Kwadrat miałby własną metodę public void podajPole() i ktoś chciałby na obiekcie Figura kwadrat = new Kwadrat() wykonać tę metodę? Często o to też pytają na rozmowie.
Poza tą jedną rzeczą, to artykuł naprawdę trafia do czytelnika i w prostych słowach tłumaczy zagadnienie. Dziękuję 😉

Pozdrawiam!

Paweł
Paweł
2 lat temu
Reply to  Paweł

Może od razu dodam. Należy rzutować Figura kwadrat na Kwadrat kwadrat. Tylko trzeba mieć pewność, że na 100% zawsze podany obiekt będzie obiektem tworzonym z obiektu Kwadrat.

((Kwadrat) kwadrat).podajPole()

3
0
Would love your thoughts, please comment.x