Spojrzałem na inne definicje i wyjaśnienia i żadne z nich mnie nie zadowoliło. Chcę zobaczyć, czy ktoś może zdefiniować polimorfizm w co najwyżej dwóch zdaniach bez użycia żadnego kodu ani przykładów. Nie chcę słyszeć „A więc masz osobę / samochód / otwieracz do puszek ...” ani tego, jak to słowo pochodzi (nikt nie jest pod wrażeniem, że wiesz, co oznacza poly i morph). Jeśli bardzo dobrze rozumiesz, czym jest polimorfizm i dobrze władasz językiem angielskim, powinieneś być w stanie odpowiedzieć na to pytanie w krótkiej, aczkolwiek zwartej definicji. Jeśli twoja definicja dokładnie określa polimorfizm, ale jest tak gęsta, że wymaga kilku przeglądów, to właśnie tego szukam.
Dlaczego tylko dwa zdania? Ponieważ definicja jest krótka i inteligentna. Wyjaśnienie jest długie i zawiera przykłady oraz kod. Poszukaj wyjaśnień (odpowiedzi na tych stronach nie są satysfakcjonujące na moje pytanie):
Polimorfizm a zastępowanie vs przeciążanie
Spróbuj opisać polimorfizm tak prosto, jak tylko potrafisz
Dlaczego zadaję to pytanie? Ponieważ zadano mi to samo pytanie i stwierdziłem, że nie jestem w stanie podać zadowalającej definicji (według moich standardów, które są dość wysokie). Chcę zobaczyć, czy któryś z wielkich umysłów na tej stronie może to zrobić.
Jeśli naprawdę nie możesz spełnić wymogu dwóch zdań (jest to trudny do zdefiniowania temat), to dobrze, jeśli przejdziesz dalej. Chodzi o to, aby mieć definicję, która faktycznie definiuje, czym jest polimorfizm i nie wyjaśnia, co on robi ani jak go używać (zrozumieć różnicę?).
źródło
Odpowiedzi:
Polimorfizm pozwala na wyrażenie pewnego rodzaju kontraktu, z potencjalnie wieloma typami implementującymi ten kontrakt (poprzez dziedziczenie klas lub nie) na różne sposoby, każdy zgodnie z własnym celem. Kod korzystający z tej umowy nie powinien (*) musieć dbać o to, która implementacja jest zaangażowana, a jedynie, aby umowa była przestrzegana.
(*) W każdym razie w idealnym przypadku - oczywiście dość często kod wywołujący wybrał odpowiednią implementację bardzo celowo!
źródło
Generalnie owoce można jeść, ale różne rodzaje owoców są spożywane na różne sposoby. Jabłko, które jest owocem, można jeść (bo to owoc). Banana też można jeść (bo to też owoc), ale inaczej niż jabłko. Najpierw to obierasz.
Cóż, przynajmniej ja, ale w niektórych manierach jestem dziwny, więc co ja wiem.
To ilustruje dziedziczenie (owoce można jeść), polimorfizm (coś, co je owoc, może jeść wszystkie rodzaje owoców) i hermetyzację (banan ma skórkę).
A tak poważnie, dziedziczenie obiektów, polimorfizm, hermetyzacja, rzeczy wirtualne, abstrakcyjne, prywatne, publiczne - to wszystko są trudne pojęcia. Jeśli ktoś absolutnie chce mieć 2-zdaniową definicję tego, oznacz to pytanie jako wariant code-golf, ponieważ dwa takie zdania będą musiały być tak zwięzłe, że jeśli nie wiesz już, co to jest, nie dowiesz się wystarczająco dużo aby wiedzieć, czego potrzebujesz, aby dowiedzieć się więcej.
źródło
Polimorfizm to deklarowanie jednolitego interfejsu, który nie jest świadomy typów, pozostawiając szczegóły implementacji konkretnym typom, które implementują interfejs.
źródło
Wikipedia: Polimorfizm to funkcja języka programowania, która umożliwia obsługę wartości różnych typów danych przy użyciu jednolitego interfejsu. Dla mnie całkiem proste.
źródło
W rzeczywistości istnieje wiele form polimorfizmu i jest co do niego sporo kontrowersji; możesz nawet spotkać profesorów CS, którzy nie potrafią tego właściwie zdefiniować. Znam trzy rodzaje:
polimorfizm ad-hoc (wygląda jak kaczka i chodzi jak kaczka => jest kaczką). Można go zobaczyć na przykład w Haskell i Pythonie.
polimorfizm ogólny (gdzie typ jest wystąpieniem pewnego typu ogólnego). Można to zobaczyć na przykład w C ++ (wektor int i wektor ciągu mają rozmiar funkcji składowej).
polimorfizm podtypu (gdzie typ dziedziczy po innym typie). Można go zobaczyć w większości języków programowania OO (np. Trójkąt jest kształtem).
źródło
Naprawdę rozumiem, dlaczego zadajesz to pytanie. Rozumiem polimorfizm, ale byłam na rozmowie o pracę i poproszono mnie o podanie krótkiej i jasnej definicji polimorfizmu. Ponieważ nie mogłem podać jasnej i krótkiej definicji, zacząłem o tym myśleć i oto moja definicja:
Zdolność obiektów jednego typu do posiadania jednego i tego samego interfejsu, ale innej implementacji tego interfejsu.
źródło
Definicja :
Polimorfizm to słowo za 10 dolarów na pomysł za 1 dolara - że kiedy proszę o coś do zrobienia, nie obchodzi mnie, jak to zostanie osiągnięte, o ile efekt końcowy jest odpowiedni. Tak długo, jak usługa jest poprawnie, ja nie dbam o realizację .
Dyskusja
Chociaż jest powszechnie stosowany w tworzeniu oprogramowania, zwłaszcza w systemach opracowanych zgodnie z zasadami zorientowanymi obiektowo, polimorfizm jest zasadniczo zasadą świata rzeczywistego i powinien być definiowany w kategoriach świata rzeczywistego, a nie technologicznego.
Przykłady
Kiedy chcę zadzwonić, odbieram telefon, wybieram numer i rozmawiam z rozmówcą. Nie obchodzi mnie, kto wyprodukował telefon, jakiej technologii używa, czy jest to przewodowe, bezprzewodowe, mobilne czy VOIP, czy jest na gwarancji.
Kiedy chcę wydrukować dokument, drukuję go. Nie obchodzi mnie język wdrożenia, marka drukarki, styl połączenia, dobór materiałów eksploatacyjnych czy jakość papieru.
źródło
Encapsulation
dla mnie jak przykładWiele implementacji tego samego interfejsu.
Przykład: W wielu modelach telefonów zastosowano interfejs klawiatury numerycznej.
źródło
Polimorfizm to strategia zorientowana obiektowo, używana podczas projektowania modeli obiektowych, aby uprościć kod. Podstawowym polimorfizmem jest zdolność definiowania dwóch podobnych, ale różnych obiektów, a następnie traktowania tych dwóch obiektów tak, jakby były takie same.
Ok, to trudne ....
źródło
Pomyślałem, że dodam własną interpretację tego, czym jest polimorfizm: bardzo ogólnie, polimorfizm jest aktem dostarczania pojedynczego interfejsu dla bytów różnych typów .
To dość ogólne, ale to jedyny sposób, w jaki mogę wymyślić wszystkie trzy typy polimorfizmów, o których wiem: ad hoc , parametryczne i podtyp . Bardziej szczegółowo omówię poniżej i posortowałem typy polimorfizmów według nazwy, alfabetycznie. Ten, który Cię interesuje, to najprawdopodobniej polimorfizm podtypu , który jest ostatnim.
Polimorfizm ad hoc
Polimorfizm ad hoc to czynność polegająca na zapewnieniu wielu implementacji tej samej metody dla różnych typów parametrów. W OOP jest to ogólnie znane jako przeciążanie metod . Na przykład:
Obie
format
metody współużytkują jeden interfejs , ale działają na obiektach różnych typów .Polimorfizm parametryczny
Polimorfizm parametryczny to czynność polegająca na tym, że klasa (lub metoda) działa na typie, który sam jest parametrem klasy (lub metody). Jest często określany jako rodzajowy .
Na przykład Java
List[T]
oczekuje parametruT
w czasie tworzenia instancji, a ten parametr definiuje typ wynikowego obiektu.Uwaga dla purystów, że celowo ignoruję surowe typy, ponieważ czuję, że w tym kontekście po prostu zamuliliby wody.
List[String]
iList[Date]
współdzielą jeden interfejs , ale działają (i są) różnymi typami .Polimorfizm podtypu
Polimorfizm podtypów jest prawdopodobnie tym, co początkowo miałeś na myśli w swoim pytaniu: jest to czynność polegająca na zapewnieniu pojedynczego interfejsu dla wielu implementacji tego samego typu.
Aby użyć zwyczajowego przykładu:
Animal
zawiera umowę, której muszą przestrzegać wszystkie wdrożenia.Dog
jestAnimal
i jako taki obsługuje wszystkie operacje, któreAnimal
deklarują. Zgodnie z zasadą podstawienia Liskova pozwala to na użycie instancji, wDog
którejAnimal
oczekiwana jest instancja (ale nie na odwrót).Jeśli obie są podklasami
Cat
iDog
są podklasamiAnimal
, to mają wspólny interfejs, ale w rzeczywistości są różnymi typami .Odchodzę tutaj w pewnym stopniu, ale polimorfizm podtypu jest (jak sądzę) jedynym, który pozwala na przesłonięcie : akt redefiniowania zachowania metody zdefiniowanej przez klasę nadrzędną. Jest to często mylone z przeciążeniem, które, jak widzieliśmy wcześniej, jest rodzajem polimorfizmu i w rzeczywistości nie wymaga podklasy (ani tak naprawdę nie potrzebuje klas).
źródło
Wygląda na to, że podano tutaj najlepsze definicje, więc pozwólcie, że dodam moje dwa centy , tylko dla innych obserwatorów. Mam nadzieję, że mogłoby to bardziej pomóc.
Istnieją dwa rodzaje polimorfizmu:
To jest po prostu przeciążanie metod i przeciążanie operatorów
Pierwszy termin jest dziedziczony z terminologii Java i C ++.
Ale w terminologii .NET tylko druga ( mam na myśli polimorfizm w czasie wykonywania ) jest tak naprawdę uważana za polimorfizm i po prostu nazywana polimorfizmem .
O ile wiem, istnieją trzy metody implementacji polimorfizmu (w czasie wykonywania ) .
Prosty przykład polimorfizmu opartego na interfejsach:
Wynik:
źródło
Polimorfizm to abstrakcja kodowania oprogramowania, w której kilka różnych bazowych jednostek (zwykle danych, ale nie zawsze) ma wspólny interfejs, który pozwala im wyglądać i działać identycznie w czasie wykonywania. Używamy tego jako techniki programistycznej, aby wymusić spójne zachowanie w szerokim zakresie podobnych, ale nie identycznych wystąpień z absolutnie minimalną implementacją, zmniejszając w ten sposób oczekiwanie na błędy i niespójności.
Paweł.
źródło
polimorfizm == wiele klas + te same sygnatury metod + zachowanie specyficzne dla klasy.
źródło
Wiele form jednego obiektu nazywa się polimorfizmem.
źródło
Wielopostaciowość
Różne obiekty mogą reagować na tę samą wiadomość na różne sposoby, umożliwiać obiektom interakcję ze sobą bez znajomości ich dokładnego typu.
Via: http://www.agiledata.org/essays/objectOrientation101.html
źródło
Polimorfizm to zdolność obiektu do pojawiania się i zachowywania się różnie dla tego samego wywołania. np .: każde zwierzę wygląda i brzmi inaczej (kiedy w nie trafisz :))
źródło
Polimorfizm to cecha języków programowania, która pozwala traktować obiekt jako instancję jego nadtypu.
źródło
Nadanie jednej nazwy zestawowi analogicznych operacji na różnych typach. Jeśli zrobisz to dobrze, analogia jest oczywista, np. „Dodawanie” liczb arytmetycznie i „dodawanie” ciągów przez konkatenację (sumowanie ich długości).
źródło
Oto definicja, którą zawsze przestrzegałem:
Dwa obiekty są między sobą polimorficzne (w odniesieniu do określonego protokołu), jeśli oba odpowiadają na te same wiadomości z tą samą semantyczną.
Polimorfizm dotyczy wiadomości, polega na możliwości odpowiadania na ten sam zestaw wiadomości z tą samą semantyczną.
Jeśli dwa obiekty mogą odpowiedzieć na puste? ale semantyczne przesłanie jest inne, to… nie są one polimorficzne.
źródło
Polimorfizm na niższym poziomie to możliwość wywołania metod, które są zdefiniowane przez implementatorów interfejsu z instancji interfejsu.
źródło
Polimorfizm to funkcja programowania, która pozwala obiektowi mieć wiele typów („kształtów”) i umożliwia traktowanie go jako dowolnego z tych typów w zależności od tego, co należy zrobić, bez znajomości innych jego typów lub dbania o nie.
źródło
Polimorfizm to funkcjonalność języka, która pozwala kodowi algorytmicznemu wysokiego poziomu działać niezmiennie na wielu typach danych. A drugie zdanie, cokolwiek to było dla ... ;-P.
(Typy obsługiwane przez C ++ są wymienione i skontrastowane w mojej odpowiedzi: Polimorfizm w c ++ )
źródło
Pojęcie polimorfizmu stało się ostatnio fenomenem. Oto rzeczywisty dryf. Środowisko wykonawcze definiuje, która metoda podrzędna powinna zostać wywołana przez odwołanie do superklasy. Co to oznacza w praktyce? To właściwie nic nie znaczy. Możesz kodować po prostu bez polimorfizmu. Więc dlaczego? Ponieważ, jeśli nie mamy polimorfizmu, musieliśmy zapamiętać wszystkie definicje funkcji podklas. W praktyce ratuje nas przed tym polimorfizm.
Możesz zdefiniować listę w następujący sposób:
ale jeśli sprawdzisz
IList
, możesz skorzystać z interfejsu jako:i
IList
swobodnie korzystaj z odniesienia. Zakładając, żeIList
jest również zaimplementowana w innej klasie, możesz użyć metod tej nieznanej klasy poprzez ponowneIList
odwołanie bez próby zapamiętania tej nazwy klasy. Cudownie, prawda?Teraz nadchodzą cenniejsze informacje:
Java jest domyślnie polimorficzna, podczas gdy .NET i C ++ nie, w MS trzeba zadeklarować funkcję podstawową
virtual
(ioverride
słowo kluczowe .NET ).Istnieją również 2 integralne reguły polimorfizmu. Jedną z nich jest dziedziczenie (poprzez domniemanie interfejsu lub rozszerzanie klasy), a drugą jest nadpisywanie. Bez nadpisywania polimorfizm nie istnieje. Zauważ, że przeciążanie metod (które zawsze występuje w jednej klasie) jest również rodzajem „minimalistycznego” polimorfizmu.
źródło
Dla danego podpisu metody są uruchamiane różne implementacje metod dla różnych, powiązanych hierarchicznie klas.
źródło
Polimorfizm to możliwość korzystania z różnych klas, które implementują wspólny interfejs (lub rozszerzają wspólną klasę bazową) w powszechny sposób, bez konieczności stosowania konkretnej implementacji i przy użyciu tylko metod dostępnych we wspólnym interfejsie.
To znaczy: W Javie, zarówno jako ArrayList, jak i LinkedList, implementują List, jeśli zadeklarujesz zmienną jako List, zawsze możesz wykonywać operacje dozwolone w List, bez względu na to, czy zmienna została wystąpiona jako ArrayList czy LinkedList.
źródło
Jednostki tego samego typu (czyli zaimplementowane z tym samym interfejsem lub pochodzące z tej samej klasy) zachowują się na różne sposoby (pod tą samą nazwą metody).
źródło
Myślę, że implementacja metod o tej samej sygnaturze w różnych klasach (posiadających pewien rodzaj relacji dziedziczenia przy użyciu rozszerzeń lub implementacji) jest nadpisywaniem metody, a także polimorfizmem, ponieważ w ten sposób uzyskujemy wiele form tej samej sygnatury metody.
źródło
Myślę, że czasami obiekty są wywoływane dynamicznie. Nie masz pewności, czy obiekt byłby trójkątem, kwadratem itp. W klasycznym kształcie poly. przykład.
Aby więc zostawić to wszystko za sobą, po prostu wywołujemy funkcję klasy pochodnej i zakładamy, że zostanie wywołana jedna z klas dynamicznych.
Nie obchodzi cię, czy to kwadrat, trójkąt czy prostokąt. Po prostu zależy ci na okolicy. Stąd metoda getArea zostanie wywołana w zależności od przekazanego obiektu dynamicznego.
źródło
Polimorfizm to zdolność funkcji do automatycznego dostosowywania się do przyjmowania danych wejściowych różnych typów danych. Możesz „Dodaj” dwa podwójne „1,1” i „2,2” i otrzymać „3,3” lub „Dodaj” dwa ciągi znaków „Stack” i „Overflow” i uzyskać „StackOverflow”.
źródło
Polimorfizm ma miejsce, gdy różne obiekty reagują na tę samą metodę w inny sposób. Na przykład samochód porusza się po jezdni, podczas gdy osoba idzie po jezdni. To dwa obiekty inaczej reagujące na tę samą drogę.
źródło