Polimorfizm - niby wiadomo o co chodzi, ale..

0

Witam,
Zastanawia mnie dlaczego tak mocno na rozmowach mówi się o polimorfizmie i w taki dziwny sposób.

Powiedzmy, że skupiam się na Javie.

Ja osobiście wielopostaciowość rozumiem tak, że są różne klasy, mniej lub bardziej podobne od siebie: obiekty różnych typów mogą wiązać się ze sobą: na przykład przez rzutowanie Object na konkretny typ. Czy to też polimorfizm? W końcu pozwala na brzydkie i prymitywne pisanie metod, które działają z różnymi obiektami.

Z reguły warunkiem koniecznym polimorfizmu jest hierarchia klas. Wywołując metodę klasy podrzędnej w zależności od typu wybieramy odpowiednią metodę, dzięki późnemu wiązaniu (np. inaczej wyświetlamy obrazek klasy A, inaczej klasy B, a klasa abstrakcyjna lub nie Obrazek ogólny posiada własne metody, kompletne lub nie, jeśli nie należy je utworzyć w klasach potomnych). Jeśli nie chcemy robić późnego wiązania używamy na metodzie final i wywoła się metoda z klasy nadrzędnej (zabraniamy overridingu).

Co łączy metody nadpisywane w klasach potomnych? Wspólny prototyp (czyli argumenty i zwracana wartość).

Czy moje rozumienie polimorfizmu wydaje się w miarę sensowne z punktu widzenia osób, które rekrutują?

Pozdrawiam!

1

Na moje oko to może i rozumiesz "co się dzieje" ale zupełnie nie rozumiesz "po co" się to stosuje.
Polimorfizm pozwala ci na bardzo wygodne "podmienianie" implementacji bez wprowadzania wielu zmian w kodzie. Najbardziej banalny przykład to wykorzystanie List<String> zamiast konkretnej implementacji ArrayList czy LinkedList. Dzięki temu możesz nagle zmienić implementację używanej listy na własną i zmianę wprowadzasz tylko w miejscu tworzenia listy, cala reszta kodu pozostaje niezmieniona. Co więcej, możesz dokonać "podmiany" na klasę która nie istniała w chwili kiedy pisałeś sam algorytm!
Template Method dość ładnie pokazuje gdzie się to przydaje. Ostatnio pisałem program który zajmował się generowaniem raportów i histogramów na podstawie pewnych danych. Sam algorytm generacji tych raportów był zawarty w jednej klasie i wyglądał mniej więcej tak:

  • dla każdego elementu danych:
    • wyciągnij "klucz"
    • wyciągnij "wartość"
    • zapisz w multimapie klucz -> wartość
  • dla stworzonej multimapy dokonaj jej redukcji
  • zapisz wynik redukcji do pliku

I teraz:

  • wyciąganie "klucza", czyli wartości po której agregujemy, było osobnym obiektem implementującym pewien interfejs
  • wyciąganie "wartości" było osobnym obiektem implementującym pewien interfejs
  • redukowanie multimapy (np. liczenie średnich albo odchyleń etc) było osobnym obiektem implementującym pewien interfejs

I teraz zauważ że możesz do tego algorytmu wrzucić dowolne implementacje tych 3 obiektów i uzyskać nowy raport. Ja w chwili tworzenia algorytmu w ogóle nie musiałem wiedzieć o tym jakie raporty ktoś będzie chciał generować. Z punktu widzenia klasy z algorytmem w ogóle nie ma znaczenia jakie konkretne obiekty dostajemy, ważne tylko że te obiekty udostępniają pewną funkcjonalność.

0

Dzięki. Mniej więcej wiedziałem o co chodzi (bardziej z punktu widzenia uniwersalnych klas / bibliotek np. Java Collection Framework), ale nie umiałem tego opisać. A to w sumie bardzo ważne, aby precyzyjnie pokazywać swoje myśli.

Dziękuje!

1 użytkowników online, w tym zalogowanych: 0, gości: 1