Zadano mi to pytanie na zakończenie dzisiejszego egzaminu z otwartej książki i zgubiłem się. Czytałem Head first Java
i obie definicje wydawały się być dokładnie takie same. Zastanawiałem się tylko, jaka jest GŁÓWNA różnica w moim własnym umyśle. Wiem, że istnieje wiele podobnych pytań, ale nie widziałem żadnego, które zapewnia ostateczną odpowiedź.
java
oop
inheritance
polymorphism
Darren Burgess
źródło
źródło
Odpowiedzi:
Dziedziczenie ma miejsce, gdy „klasa” pochodzi od istniejącej „klasy”. Więc jeśli masz
Person
klasę, to maszStudent
klasę, która się rozszerzaPerson
,Student
dziedziczy wszystko, coPerson
ma. Istnieje kilka szczegółów dotyczących modyfikatorów dostępu, które umieszczasz w polach / metodach w Person, ale to jest podstawowa idea. Na przykład, jeśli masz włączone pole prywatnePerson
,Student
nie zobaczy go, ponieważ jego pola prywatne i prywatne nie są widoczne dla podklas.Polimorfizm dotyczy tego, w jaki sposób program decyduje, jakich metod powinien używać, w zależności od tego, jaki typ rzeczy ma. Jeśli masz a
Person
, który maread
metodę i maszStudent
rozszerzeniePerson
, które ma własną implementacjęread
, to, która metoda zostanie wywołana, jest określana przez środowisko wykonawcze, w zależności od tego, czy maszPerson
plikStudent
. To trochę skomplikowane, ale jeśli zrobisz coś takiegowywoływana jest metoda odczytu Studenta . Taki jest polimorfizm w akcji. Możesz wykonać to zadanie, ponieważ a
Student
to aPerson
, ale środowisko wykonawcze jest wystarczająco inteligentne, aby wiedzieć, że rzeczywisty typp
to Student .Pamiętaj, że szczegóły różnią się w zależności od języka. Możesz na przykład dziedziczyć w javascript, ale jest to zupełnie inne niż sposób, w jaki działa w Javie.
źródło
Person
„sread
metoda wykorzystuje modyfikator dostępu publicznego, nie będzieStudent
obiektów móc do nich dostęp? iStudent s = new Student();
czy nie będzie to łatwiejsze? Nadal nie do końca odczuwam korzyści płynące z polimorfizmu.Person p = new Student();
zamiastStudent p = new Student();
?Dziedziczenie odnosi się do wykorzystania struktury i zachowania superklasy w podklasie.
Polimorfizm odnosi się do zmiany zachowania superklasy w podklasie.
źródło
m
(zarównostatic
iinstance
) z nadklasy, dla której ...” (a następnie szczegóły dotyczące dziedziczenia). Dla mnie brzmi to jak „ponowne wykorzystanie kodu”.import static
aby wyeliminować to niewłaściwe użycie interfejsów). W przypadku czystego polimorfizmu w Javie narzędziem, które należy zastosować, są interfejsy, a nie dziedziczenie klas.Polimorfizm : zdolność do traktowania obiektów różnych typów w podobny sposób. Przykład: Żyrafa i Krokodyl to zarówno Zwierzęta, jak i zwierzęta mogą
Move
. Jeśli masz instancjęAnimal
, możesz zadzwonić,Move
nie wiedząc ani nie dbając o typ zwierzęcia.Dziedziczenie : jest to jeden ze sposobów jednoczesnego osiągnięcia polimorfizmu i ponownego wykorzystania kodu.
Inne formy polimorfizmu : istnieją inne sposoby osiągnięcia polimorfizmu, takie jak interfejsy, które zapewniają tylko polimorfizm, ale nie pozwalają na ponowne wykorzystanie kodu (czasami kod jest zupełnie inny, na przykład
Move
dla Węża byłby zupełnie inny niżMove
dla psa, w takim przypadku Interfejs byłby lepszym wyborem polimorficznym w tym przypadku.W innych dynamicznych językach polimorfizm można osiągnąć za pomocą Duck Typing, co oznacza, że klasy nie muszą nawet dzielić tej samej klasy bazowej lub interfejsu, potrzebują jedynie metody o tej samej nazwie. Lub nawet bardziej dynamiczny, jak Javascript, w ogóle nie potrzebujesz klas, tylko obiekt o tej samej nazwie metody może być używany polimorficznie.
źródło
Główną różnicą jest to, że polimorfizm jest specyficznym wynikiem dziedziczenia. Polimorfizm polega na określeniu metody, która ma zostać wywołana, w czasie wykonywania na podstawie typu obiektu. Jest to sytuacja, która pojawia się, gdy jedna klasa dziedziczy po innej i przesłania określoną metodę. Jednak w normalnym drzewie dziedziczenia nie trzeba przesłonić żadnych metod, a zatem nie wszystkie wywołania metod muszą być polimorficzne. Czy to ma sens? Jest to podobny problem do wszystkich samochodów Forda, ale nie wszystkie samochody są Fordami (chociaż nie do końca…).
Ponadto polimorfizm zajmuje się wywołaniem metod, podczas gdy dziedziczenie opisuje również elementy składowe danych itp.
źródło
W Javie są one ściśle powiązane. Dzieje się tak, ponieważ Java używa techniki wywoływania metody zwanej „dynamicznym wysyłaniem”. Jeżeli mam
Następnie widzimy, która dziedziczy B
spin
z A. Jednak, gdy staramy się manipulować obiektu, jak gdyby był to typ A, my wciąż za zachowanie bdraw
.draw
Zachowanie jest polimorficzny.W niektórych językach polimorfizm i dziedziczenie nie są tak blisko spokrewnione. Na przykład w C ++ funkcje, które nie zostały zadeklarowane jako wirtualne, są dziedziczone, ale nie będą wysyłane dynamicznie, więc nie uzyskasz tego polimorficznego zachowania, nawet jeśli używasz dziedziczenia.
W javascript każde wywołanie funkcji jest dynamicznie wysyłane, a Ty masz problemy z pisaniem. Oznacza to, że możesz mieć kilka niepowiązanych obiektów, każdy z własnymi
draw
, mieć funkcję iterującą po nich i wywołującą funkcję, a każdy z nich będzie się dobrze zachowywał. Miałbyś swój własny losowanie polimorficzne bez potrzeby dziedziczenia.źródło
Polimorfizm: załóżmy, że pracujesz dla firmy sprzedającej długopisy. Tworzysz więc bardzo fajną klasę o nazwie „Pióro”, która zawiera wszystko, co musisz wiedzieć o piórze. Piszesz różnego rodzaju zajęcia dotyczące fakturowania, wysyłki, tworzenia faktur, wszystko przy użyciu klasy Pen. Przychodzi jeden z szefów i mówi: „Wspaniała wiadomość! Firma się rozwija i teraz sprzedajemy książki i płyty CD!” Nie jest to świetna wiadomość, ponieważ teraz musisz zmienić wszystkie klasy, które używają pióra, aby również używały książki i płyty CD. Ale co by było, gdybyś pierwotnie utworzył interfejs o nazwie „Produkt do sprzedaży”, a Pen zaimplementował ten interfejs. Wtedy mógłbyś napisać wszystkie klasy wysyłki, fakturowania itp., Aby używać tego interfejsu zamiast pióra. Teraz wszystko, co musisz zrobić, to utworzyć nową klasę o nazwie Book & CompactDisc, która implementuje interfejs SellableProduct. Z powodu polimorfizmu wszystkie inne klasy mogły nadal działać bez zmian! Ma sens?
Oznacza to więc użycie dziedziczenia, które jest jednym ze sposobów osiągnięcia polimorfizmu.
Polimoryzm może być możliwy w klasie / interfejsie, ale dziedziczenie zawsze między 2 LUB więcej klasami / interfejsami. Dziedziczenie zawsze jest zgodne z relacją „jest-a”, podczas gdy nie zawsze jest zgodne z polimorfizmem (który może być zgodny zarówno z relacją „jest-a” / „ma-a”.
źródło
Dziedziczenie jest bardziej statyczne (jedna klasa rozszerza inną), podczas gdy polimorfizm jest dynamiczny / działający (obiekt zachowuje się zgodnie ze swoim typem dynamicznym / uruchomieniowym, a nie statycznym / deklaracyjnym).
Na przykład
-> Chociaż typ statyczny / deklaracji a to A, rzeczywisty typ dynamiczny / wykonawczy to B, a zatem a.foo () wykona foo zgodnie z definicją w B, a nie w A.
źródło
Polimorfizm to podejście do wyrażania wspólnego zachowania między typami obiektów, które mają podobne cechy. Pozwala także na tworzenie odmian tych cech poprzez nadpisywanie. Dziedziczenie to sposób na osiągnięcie polimorfizmu poprzez hierarchię obiektów, w której obiekty wyrażają relacje i abstrakcyjne zachowania. Nie jest to jednak jedyny sposób na osiągnięcie polimorfizmu. Prototyp to inny sposób wyrażania polimorfizmu, który różni się od dziedziczenia. JavaScript jest przykładem języka używającego prototypu. Wyobrażam sobie, że są też inne sposoby.
źródło
Dziedziczenie to pojęcie związane z ponownym wykorzystaniem kodu. Na przykład, jeśli mam klasę nadrzędną, powiedz
Animal
i zawiera pewne atrybuty i metody (w tym przykładzie powiedzmakeNoise()
isleep()
) i utworzę dwie klasy potomne o nazwieDog
iCat
. Ponieważ zarówno psy, jak i koty zasypiają w ten sam sposób (zakładałbym), nie ma potrzeby dodawania większej funkcjonalności dosleep()
metody w podklasachDog
iCat
zapewnianych przez klasę nadrzędnąAnimal
. JednakDog
szczeka iCat
miauczy, więc chociażAnimal
klasa mogą mieć metodę na robienie hałasu, pies i kot wydają różne odgłosy w stosunku do siebie nawzajem i innych zwierząt. W związku z tym istnieje potrzeba ponownego zdefiniowania tego zachowania pod kątem określonych typów. Stąd definicja polimorfizmu. Mam nadzieję że to pomoże.źródło
Dokumentacja Oracle precyzyjnie podawała różnicę.
dziedziczenie: klasa dziedziczy pola i metody ze wszystkich swoich nadklas, zarówno bezpośrednich, jak i pośrednich. Podklasa może przesłonić metody, które dziedziczy, lub może ukryć pola lub metody, które dziedziczy . (Należy pamiętać, że ukrywanie pól jest ogólnie złą praktyką programistyczną).
polimorfizm: polimorfizm odnosi się do zasady biologii, w której organizm lub gatunek może mieć wiele różnych form lub stadiów. Zasadę tę można również zastosować do programowania obiektowego i języków, takich jak język Java. Podklasy klasy mogą definiować własne unikalne zachowania, a mimo to współdzielić niektóre funkcje klasy nadrzędnej.
wielopostaciowość nie ma zastosowania do pól.
Powiązany post:
Polimorfizm a zastępowanie a przeciążanie
źródło
Polimorfizm jest efektem dziedziczenia . Może się to zdarzyć tylko w klasach, które się rozszerzają. Pozwala na wywołanie metod klasy bez znajomości dokładnego typu tej klasy. Ponadto polimorfizm występuje w czasie wykonywania .
Na przykład polimorfizm w Javie:
Dziedziczenie umożliwia klasom pochodnym współużytkowanie interfejsów i kodu ich klas bazowych. Dzieje się to w czasie kompilacji .
Na przykład wszystkie klasy na platformie Java są potomkami obiektu (zdjęcie dzięki uprzejmości firmy Oracle):
Aby dowiedzieć się więcej o dziedziczeniu i polimorfizmie języka Java
źródło
Dziedziczenie ma miejsce, gdy klasa A dziedziczy wszystkie niestatyczne chronione / publiczne metody / pola od wszystkich swoich rodziców do Object.
źródło
Jeśli używasz JAVA, jest to takie proste:
Polimorfizm wykorzystuje metody dziedziczone, ale „nadpisywanie” ich w celu zrobienia czegoś innego (lub tego samego, jeśli nazwiesz super, więc technicznie rzecz biorąc, nie byłoby polimorficzne).
Popraw mnie, jeśli się mylę.
źródło
Główny cel polimorfizmu : stworzenie zmiennej referencyjnej do superklasy i trzymanie obiektu podklasy => obiekt może wykonywać wiele zachowań .
W dziedziczenia , podklasa dziedziczy właściwości super klasy .
źródło
dziedziczenie jest rodzajem polimorfizmu. Dokładnie w rzeczywistości dziedziczenie jest polimorfizmem dynamicznym. Tak więc po usunięciu dziedziczenia nie można już nadpisać.
źródło
W przypadku dziedziczenia implementacja jest definiowana w nadklasie - więc zachowanie jest dziedziczone.
W przypadku polimorfizmu implementacja jest definiowana w podklasie - więc dziedziczony jest tylko interfejs .
źródło
Polimorfizm osiąga się przez dziedziczenie w
Java
.Hamster
klasa dziedziczy konstrukcja zAnimal
,Herbivore
iPet
wykazują polimorficzny behawioryzm z domowego zwierzaka.Cat
klasa dziedziczy strukturę odAnimal
,Carnivore
aPet
także wykazuje polimorficzny behawioryzm zwierzęcia domowego.źródło