Co to jest polimorfizm? – pytanie rekrutacyjne

Share on facebook
Share on twitter
Share on linkedin
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

Kamil Klimek

Pierwszy kalkulator napisany w języku Pascal w podstawówce. Później miałem trochę przygód z frontendem oraz PHP, na studiach poznałem C++ oraz Jave. Obecnie prawie 3 letnie doświadczenie jako Java full stack develop. Blog jest miejscem, dzięki któremu mogę się dzielić wiedzą i pomagać innym w nauce programowania.
Subscribe
Powiadom o
guest
3 komentarzy
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Paweł
Paweł
1 miesiąc 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ł
1 miesiąc 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
()
x