pojęcia OOP dla początkujących: czym jest polimorfizm

pojęcia OOP dla początkujących: czym jest polimorfizm

słowo polimorfizm jest używane w różnych kontekstach i opisuje sytuacje, w których coś występuje w kilku różnych formach. W informatyce opisuje koncepcję, że obiekty różnych typów mogą być dostępne za pośrednictwem tego samego interfejsu. Każdy typ może zapewnić własną, niezależną implementację tego interfejsu. Jest to jedna z podstawowych koncepcji programowania obiektowego (OOP).,

Jeśli zastanawiasz się, czy obiekt jest polimorficzny, możesz wykonać prosty test. Jeśli obiekt pomyślnie przejdzie wiele testów is – a lub instanceof, jest polimorficzny. Jak już opisałem w moim poście o dziedziczeniu, wszystkie klasy Javy rozszerzają obiekt klasy. Z tego powodu wszystkie obiekty w Javie są polimorficzne, ponieważ przechodzą co najmniej dwie instanceof.,

różne typy polimorfizmu

Java obsługuje 2 typy polimorfizmu:

  • statyczny lub czas kompilacji
  • dynamiczny

polimorfizm statyczny

Java, podobnie jak wiele innych zorientowanych obiektowo języków programowania, umożliwia implementację wielu metod w ramach tej samej klasy, które używają tej samej nazwy, ale innego zestawu parametrów. Nazywa się to przeciążeniem metody i reprezentuje statyczną formę polimorfizmu.,

zestawy parametrów muszą różnić się co najmniej jednym z następujących trzech kryteriów:

  • muszą mieć inną liczbę parametrów, np. jedna metoda przyjmuje 2, a druga 3 parametry.
  • typy parametrów muszą być różne, np. jedna metoda przyjmuje Łańcuch znaków, a druga Long.
  • muszą oczekiwać parametrów w innej kolejności, np. jedna metoda akceptuje Łańcuch znaków i długi, a druga przyjmuje długi i łańcuch znaków. Tego rodzaju przeciążenie nie jest zalecane, ponieważ utrudnia zrozumienie API.,

w większości przypadków każda z tych przeciążonych metod zapewnia inną, ale bardzo podobną funkcjonalność.

ze względu na różne zestawy parametrów, każda metoda ma inny podpis. Pozwala to kompilatorowi określić, która metoda ma być wywołana i powiązać ją z wywołaniem metody. Takie podejście nazywa się wiązaniem statycznym lub polimorfizmem statycznym.

przyjrzyjmy się przykładowi.

prosty przykład polimorfizmu statycznego

używam tego samego projektu CoffeeMachine, co w poprzednich postach tej serii. Możesz go sklonować pod adresem https://github.com/thjanssen/Stackify-OopInheritance.,

Klasa BasicCoffeeMachine implementuje dwie metody o nazwie brewCoffee. Pierwszy przyjmuje jeden parametr typu CoffeeSelection. Druga metoda przyjmuje dwa parametry, CoffeeSelection i int.

teraz, gdy wywołujesz jedną z tych metod, podany zestaw parametrów identyfikuje metodę, która ma zostać wywołana.

w poniższym fragmencie kodu wywołuję metodę tylko z obiektem CoffeeSelection. W czasie kompilacji kompilator Java wiąże wywołanie tej metody z metodą brewCoffee (CoffeeSelection selection).,

BasicCoffeeMachine coffeeMachine = createCoffeeMachine();coffeeMachine.brewCoffee(CoffeeSelection.FILTER_COFFEE);

jeśli zmienię ten kod i wywołam metodę brewCoffee z obiektem CoffeeSelection i INT, kompilator połączy wywołanie metody z inną metodą brewCoffee(wybór CoffeeSelection, numer int).

polimorfizm dynamiczny

Ta forma polimorfizmu nie pozwala kompilatorowi określić wykonanej metody. JVM musi to zrobić w czasie wykonywania.

w hierarchii dziedziczenia podklasa może nadpisać metodę swojej klasy nadrzędnej. Dzięki temu programista podklasy może dostosować lub całkowicie zastąpić zachowanie tej metody.,

tworzy również formę polimorfizmu. Obie metody, zaimplementowane przez super-i podklasę, mają tę samą nazwę i parametry, ale zapewniają inną funkcjonalność.

przyjrzyjmy się innemu przykładowi z projektu CoffeeMachine.

nadpisywanie metody w hierarchii dziedziczenia

Klasa BasicCoffeeMachine jest klasą nadrzędną klasy PremiumCoffeeMachine.

obie klasy zapewniają implementację metody brewCoffee (CoffeeSelection selection).,

Jeśli czytasz post o dziedziczeniu koncepcji OOP, znasz już dwie implementacje metody brewCoffee. BasicCoffeeMachine obsługuje tylko wybór CoffeeSelection.FILTER_COFFEE. Metoda brewCoffee klasy PremiumCoffeeMachine dodaje obsługę CoffeeSelection.ESPRESSO. Jeśli zostanie wywołane z innymi CoffeeSelection, użyje słowa kluczowego super, aby delegować połączenie do superclass.,

późne wiązanie

Jeśli chcesz użyć takiej hierarchii dziedziczenia w swoim projekcie, musisz być w stanie odpowiedzieć na następujące pytanie: Jaką metodę wywoła JVM?

na które można odpowiedzieć tylko w trybie runtime, ponieważ zależy to od obiektu, na którym zostanie wywołana metoda. Typ odniesienia, który możesz zobaczyć w kodzie, nie ma znaczenia. Musisz rozróżnić trzy ogólne scenariusze:

  1. Twój obiekt jest typu superclass i jest określany jako superclass., Tak więc, w przykładzie tego postu, obiekt BasicCoffeeMachine zostanie odwołany jako obiekt BasicCoffeeMachine.
  2. Twój obiekt jest typu podklasy i jest określany jako podklasa. W przykładzie tego postu obiekt PremiumCoffeeMachine jest określany jako PremiumCoffeeMachine.
  3. Twój obiekt jest typu podklasy i jest określany jako klasa nadrzędna. W przykładzie CoffeeMachine obiekt PremiumCoffeeMachine jest określany jako BasicCoffeeMachine.
Superklasa

pierwszy scenariusz jest dość prosty., Gdy tworzysz instancję obiektu BasicCoffeeMachine i przechowujesz go w zmiennej typu BasicCoffeeMachine, JVM wywoła metodę brewCoffee w klasie BasicCoffeeMachine. Można więc zaparzyć tylko kawę.FILTER_COFFEE.

podklasa

drugi scenariusz jest podobny. Ale tym razem stworzyłem instancję PremiumCoffeeMachine i nazwałem ją PremiumCoffeeMachine. W tym przypadku JVM wywołuje metodę brewCoffee klasy PremiumCoffeeMachine, która dodaje obsługę CoffeeSelection.ESPRESSO.,

podklasa określana jako superklasa

jest to najciekawszy scenariusz i główny powód, dla którego wyjaśniam dynamiczny polimorfizm w takich szczegółach.

kiedy tworzysz instancję obiektu PremiumCoffeeMachine i przypisujesz go do zmiennej basiccoffeemachine coffeeMachine, nadal jest to obiekt PremiumCoffeeMachine. Wygląda jak podstawowa Machina.

kompilator nie widzi tego w kodzie i możesz używać tylko metod dostarczonych przez klasę BasicCoffeeMachine., Ale jeśli wywołasz metodę brewCoffee na zmiennej coffeeMachine, JVM wie, że jest obiektem typu PremiumCoffeeMachine i wykona nadpisaną metodę. To się nazywa późne wiązanie.

podsumowanie

polimorfizm jest jednym z podstawowych pojęć w językach OOP. Opisuje koncepcję, że różne klasy mogą być używane z tym samym interfejsem. Każda z tych klas może zapewnić własną implementację interfejsu.

Java obsługuje dwa rodzaje polimorfizmu. Można przeciążać metodę różnymi zestawami parametrów., Nazywa się to polimorfizmem statycznym, ponieważ kompilator statycznie wiąże wywołanie metody z określoną metodą.

w hierarchii dziedziczenia podklasa może nadpisać metodę swojej klasy nadrzędnej. Jeśli utworzysz instancję podklasy, JVM zawsze wywoła metodę overridden, nawet jeśli oddasz podklasę do jej klasy nadrzędnej. To się nazywa dynamiczny polimorfizm.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *