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

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

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:

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

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

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 :)

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 ??

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

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.

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