Polimorfizm - jak to rozumieć?

Polimorfizm - jak to rozumieć?
0

Cześć, mam takie oto zdanie w zadaniu: "Zaimplementuj klasę pochodną Sniadanie, która dodatkowo posiada pole rodzajHerbaty. Herbata może mieć trzy rodzaje smaków: cytrynowa, malinowa, owocowa. Dla klasy przygotuj wszystkie operatory, które posiadała klasa Danie – zastosuj polimorfizm". Jak to rozumieć? Operatory czyli setery/getery? Ale co z tym polimorfizmem, dodam że klasa Danie jest klasą abstrakcyjną.

Pozdrawiam

Wave21
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:34
0

Też nie bardzo ogarniam o co chodzi z tymi operatorami (jedyne operatory jakie kojarzę to +-*/ && itd. ), może coś się walną ktoś w tym zadaniu. Ale jeżeli chodzi i polimorfozm to każda klasa pochodna czyli tutaj śniadanie musi zaimplementować wszystkie metody abstrakcyjne klasy nadrzędnej a jeśli chce to może nadpisać także metody zwykłe ale nie musi. A co do tych 3 rodzajów herbaty to może sobie to zrobić na enumeratorze.

0

Herbaty zrobiłem na tablicy i tyle :D

nie100sowny
  • Rejestracja:około 9 lat
  • Ostatnio:około 21 godzin
  • Lokalizacja:Kraków
  • Postów:402
0

Jeżeli mówimy o Javie to nie ma możliwości przeciążać operatorów, i pewnie ktoś jako operatory rozumie wszystkie operacje/metody klasy. Koncepcyjnie jest niewielka różnica pomiędzy:

Kopiuj
number = number + number;
number = number.add(number);

Co do polimorfizmu, dzięki niemu możliwy jest taki kod:

Kopiuj
List<Danie> dania = Arrays.asList(
    new Sniadanie(),
    new Obiad(),
    new Kolacja()
);

for(Danie danie : dania) {
    danie.dodaj(new Napoj());
}

Czyli, że do klas pochodny możesz odwoływać się przez referencję na klasy bazowe. Następuje tzw. późne wiązanie, czyli metoda dodaj jest wybierana dynamicznie podczas wykonania na podstawie typu obiektu. Polimorfizm to jedna z największych zalet programowania obiektowego. Pozwala tworzyć hierarchie obiektów i kody które te obiekty procesują w spójny sposób. Bez instrukcji if lub switch :)


"Gdy się nie wie, co się robi, to się dzieją takie rzeczy, że się nie wie, co się dzieje"
edytowany 2x, ostatnio: nie100sowny
0

@nie100sowny a jeśli mam klasę abstrakcyjną bazową która posiada pole opis posiłku, teraz mam metodę w klasie dziedziczącej która ma za zadanie wypisać informację który deser został wybrany a dodatkowo wypisać opis czy w takim wypadku polimorfizm też będzie miał miejsce ??

nie100sowny
  • Rejestracja:około 9 lat
  • Ostatnio:około 21 godzin
  • Lokalizacja:Kraków
  • Postów:402
0

Pola klasy są dziedziczone (public i protected). Więc klasa dziedzicząca będzie miała pole opis posiłku. Jednak żeby nie było nieporozumień w przypadku pół mechanizm wiązań nie ma sensu.
Pole w klasie pochodnej jest obecne i jego wartość zależy od jej konstruktora, chyba że wywołasz w nim super() to wtedy decyduje konstruktor klasy bazowej.

Czyli pole jest dziedziczone, ale o wartości decydują np. konstruktory lub inne metody, które są polimorficzne.

Najlepiej proponuję poeksperymentować :D


"Gdy się nie wie, co się robi, to się dzieją takie rzeczy, że się nie wie, co się dzieje"
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 3 godziny
  • Postów:8423
1

Cześć, mam takie oto zdanie w zadaniu: "Zaimplementuj klasę pochodną Sniadanie, która dodatkowo posiada pole rodzajHerbaty. Herbata może mieć trzy rodzaje smaków: cytrynowa, malinowa, owocowa.

bardziej obiektowo to klasa Śniadanie nie powinna trzymać informacji o herbacie czy jest malinowa czy owocowa, tylko raczej powinna trzymać gdzieś samą referencję do napoju (albo napojów) gdzie napój mógłby być instancją klasy Herbata (albo innej, np. instancją klasy Kawa) i dopiero herbata zawierałaby w sobie informacje czy jest cytrynowa, malinowa czy owocowa, czy może jest malinowo-owocowo-cytrynowa.

Co do polimorfizmu to tak. Jeśli masz klasę Danie, to ono ma jakieś operacje np. sprawdźCenę*, które oblicza cenę specyficzną dla danego dania. Np. możesz sobie założyć, że będziesz miał Happy Hours w swojej knajpie na śniadania. Ale tylko między 9 a 10. Więc powiedzmy robisz metodę sprawdźCenę klasie Śniadanie, ktora ta metoda automatycznie będzie sprawdzała czy jest między 9 a 10 rano i jeśli tak, to obniży cenę o 50%.

Z drugiej strony możesz kiedyś zrobić klasy Obiad czy Familijna Wyżerka, która będzie miała inne warunki promocji i cen, więc będzie miała własną metodę sprawdźCenę.

Z drugiej strony zewnętrzne obiekty (np. obiekt Kasa) nie muszą wiedzieć, czy mają do czynienia ze Śniadaniem czy z Obiadem, wiedzą tylko tyle, że mają do czynienia z obiektem klasy Danie, która definiuje pewien wspólny interfejs, w skład którego będzie wchodziła metoda sprawdźCenę :)

*tak się przyjęło i tak ci radzę, żeby w kodzie wszystkie zmienne pisać po angielsku, ale na potrzeby przykładu niech będzie, że sprawdźCenę a nie np. getPrice.


edytowany 2x, ostatnio: LukeJL

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.