Polimorfizm - zdefiniuj w zaledwie dwóch zdaniach [zamknięte]


85

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ę?).


Jedna nazwa, wiele wdrożeń.
Prosunjit Biswas

2
Zadano mi to pytanie podczas rozmowy kwalifikacyjnej. Czułem, że zadawanie tego pytania podczas rozmowy kwalifikacyjnej było elitarnym aktem snobizmu, o coś, o co zapytałby pracownik Google z satysfakcją, zakładając, że nikt nie może odpowiedzieć skutecznie. Jeśli nie dostałeś pracy, ponieważ nie mogłeś odpowiedzieć, prawdopodobnie lepiej będzie, jeśli pracujesz dla ludzi, których bardziej interesuje to, co możesz zrobić, niż tych, których możesz przechytrzyć.
MagicLAMP,

Polimorfizm jest bardzo ważną koncepcją, którą należy zrozumieć w rozwoju. Gorąco polecam przynajmniej zrozumienie jego wartości, jeśli nie formalnej definicji. Proponuję być w stanie przynajmniej wyjaśnić, jak działa wzorzec Strategii i jaka jest jego wartość.
Chad Johnson

Odpowiedzi:


106

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!


1
Mark, czy w pewnym momencie zaakceptowałeś tę odpowiedź, a potem ją odrzuciłeś? Próbuję dowiedzieć się, co wygląda na błąd w systemie reputacji - ta odpowiedź dała mi dzisiaj -15 powtórzeń netto, o dziwo.
Jon Skeet,

To samo, Jon - mam teraz 2 zaakceptowane odpowiedzi z -15 rep. Nie to, że mnie to obchodzi, ale jest to intrygujące.
Otávio Décio

3
Ściśle mówiąc, nie ma wymogu, aby „jeden typ wyrażał jakąś umowę”. Jedyne, co jest naprawdę wymagane, to to, że wiele implementacji może odpowiadać na tę samą wiadomość bez nadawcy wiadomości, który musi wiedzieć lub dbać o to, która implementacja obsługuje wiadomość.
Doug Knesek

3
@Doug: Jeśli nie ma umowy, nawet sugerowanej przez dokumentację lub nazewnictwo, to skąd wiesz, że zrobi to, czego chcesz? Mówisz o „interfejsie” w swojej własnej odpowiedzi - co dla mnie brzmi jak kontrakt - co widzisz jako różnicę? Zarówno „interfejs”, jak i „kontrakt” to słowa, których można używać w „silnym” sensie (np. Wymuszane w czasie kompilacji) lub bardzo luźno (np. Przez konwencję nazewnictwa i dynamiczne typowanie).
Jon Skeet

1
@Alex: Tak, to byłaby zmiana, którą bym cofnął - wolę moje sformułowanie. Zawsze możesz jednak dodać własną odpowiedź.
Jon Skeet

72

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.


lassevk: "jeśli nie wiesz już, co to jest, nie nauczysz się o tym wystarczająco dużo, aby wiedzieć, czego potrzebujesz, aby dowiedzieć się więcej na temat" << Tylko dla wyjaśnienia, tego właśnie oczekuję. Szukam definicji, której zrozumienie może wymagać trochę przemyślenia. Nie taki, który byłby używany do nauczania początkującego.
Mark Testa

2
Zebrałem to, właśnie opublikowałem nieco zabawną (w każdym razie dla mnie) odpowiedź :) Polimorfizm i OOP to jedna z tych wielkich ścian, w których jeśli wykreślisz krzywą uczenia się, po prostu uderzysz w dużą ścianę i albo się po niej czołgasz albo nie. Jeśli tak, to zwykle masz duże AHA! doświadczenie ...
Lasse V. Karlsen

8
Hemlock to też owoc! Możesz to zjeść, ale tylko raz!
James Anderson

@JamesAnderson Więc singleton?
Lasse V. Karlsen

47

Polimorfizm to deklarowanie jednolitego interfejsu, który nie jest świadomy typów, pozostawiając szczegóły implementacji konkretnym typom, które implementują interfejs.


To jest niesamowicie zwięzłe i myślę, że pasuje idealnie
Alex W

21

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.


21

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


2
+1 za wspomnienie, że istnieją różne typy polimorfizmu. Jednak Twoja definicja polimorfizmu ad hoc wydaje się być zupełnie inna niż ta wspomniana na stronie en.wikipedia.org/wiki/Type_polymorphism . Ta strona mówi, że istnieją 2 typy (ad-hoc i parametryczne), a nie 3, a także rozróżnia funkcje polimorficzne i polimorficzne typy danych. Twoje 3 typy, o ile mogę określić, odpowiadają odpowiednio parametrycznym funkcjom polimorficznym, parametrycznym typom danych polimorficznych i funkcjom polimorficznym ad-hoc.
Laurence Gonsalves,

cześć, jaka jest różnica między „wystąpieniem pewnego typu ogólnego” a „dziedziczy z innego typu”, które wydają się mówić to samo?
Shanimal

@LaurenceGonsalves fwiw, link podany w pierwszym komentarzu wskazuje na trzy typy. Polimorfizm parametryczny definiuje się jako umożliwiający „ogólne” zapisanie funkcji lub typu danych.
Shanimal

14

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.


10

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.


5
brzmi Encapsulationdla mnie jak przykład
Singleton

1
Polimorfizm, enkapsulacja i abstrakcja są ze sobą ściśle powiązane, chociaż skupiają się na różnych perspektywach. Dobre abstrakcje ułatwiają osiągnięcie polimorfizmu, a dobra hermetyzacja pomaga zapobiegać „wyciekaniu” szczegółów.
Bevan

10

Wiele implementacji tego samego interfejsu.

Przykład: W wielu modelach telefonów zastosowano interfejs klawiatury numerycznej.


8

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


7

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:

public String format(int a) {
    return String.format("%2d", a);
}

public String format(Date a) {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}

Obie formatmetody 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 parametru Tw 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]i List[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: Animalzawiera umowę, której muszą przestrzegać wszystkie wdrożenia. Dogjest Animali jako taki obsługuje wszystkie operacje, które Animaldeklarują. Zgodnie z zasadą podstawienia Liskova pozwala to na użycie instancji, w Dogktórej Animaloczekiwana jest instancja (ale nie na odwrót).

Jeśli obie są podklasami Cati Dogsą podklasami Animal, 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).


a co z polimorfizmem opartym na interfejsie?
siamak

@siamak czy to nie jest tylko określony rodzaj polimorfizmu podtypu, w którym typ nadrzędny jest całkowicie abstrakcyjny? Czy masz na myśli coś innego?
Nicolas Rinaudo

Moim zamiarem jest interfejs jako typ odniesienia, który istnieje w językach zorientowanych obiektowo, na przykład: Interfejs I1 {void M ();} Wierzę, że istnieje tak wiele różnic między podtypem lub polimorfizmem opartym na dziedziczeniu a polimorfizmem opartym na interfejsie . Ponieważ istnieje relacja „Is-a” w polimorfizmie opartym na dziedziczeniu między typami, ale nie ma czegoś takiego w polimorfizmie opartym na interfejsie. W rzeczywistości to samo zachowanie z różnymi implementacjami może być wspólne dla różnych typów (klas)
siamak

Muszę przyznać, że jestem zdezorientowany - poza twoim nieco balistycznym podejściem do górnej obudowy, wydaje się, że twój opis tego, co nazywasz polimorfizmem opartym na interfejsie, jest dokładnie taki sam, jak mój opis polimorfizmu podtypu. Jestem pewien, że widzisz różnicę, ale obawiam się, że nie jest to dla mnie jasne.
Nicolas Rinaudo

Jak widać, między samochodem a ptakiem i człowiekiem nie ma żadnego związku, ale mogą one poruszać się po swojemu. Istnieje ogromna różnica między klasą abstrakcyjną a interfejsem, a używanie interfejsu to nie to samo, co podtypy, więc moim zdaniem polimorfizm dziedziczenia i polimorfizm oparty na interfejsie nie są tym samym i nie są równe. // to trudne, kodowanie w segmencie komentarzy //
siamak

6

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:

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

To jest po prostu przeciążanie metod i przeciążanie operatorów

2.  Run time or (dynamic) polymorphism.

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

 1. Parametric polymorphism or simply the use of generics (templates in C++).

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

Prosty przykład polimorfizmu opartego na interfejsach:

interface Imobile
{
    void Move();
}

class Person :Imobile
{
    public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}

class Bird :Imobile
{
    public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}

class Car :Imobile
{
    public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}


class Program
{

    static void Main(string[] args)
    {
        // Preparing a list of objects
        List<Imobile> mobileList = new List<Imobile>();

        mobileList.Add(new Person());
        mobileList.Add(new Bird());
        mobileList.Add(new Car());

        foreach (Imobile mobile in mobileList)
        {
            mobile.Move();
        }

        // Keep the console open
        Console.WriteLine("Press any key to exit the program:");
        Console.ReadKey();
    }
}

Wynik:

 I am a person and am moving in my way.
 I am a bird and am moving in my way.
 I am a car and am moving in my way.
 Press any key to exit the program:

Nadal nie widzę różnicy, jaką robisz. Osoba, Ptak i Samochód są podtypami Imobile. Osoba to Imobile, Bird to Imobile, a Car to Imobile. Gdybyś miał wymagać zmiennej typu Imobile, mógłbyś użyć instancji Person, Bird lub Car, wszystkie użyłyby sprawdzenia typu. Dokładnie to oznacza polimorfizm podtypu.
Nicolas Rinaudo

Ptak, Osoba i Samochód nie są podtypami Imobile, są implementatorami tego interfejsu i „Uświadamiają sobie” ten interfejs na swój własny sposób. Termin „podtyp” jest szeroko stosowany między rzeczywistym typem a rzeczywistym podtypem, który po nim odziedziczył, iw tej sytuacji istnieje między nimi relacja „Is-a”, na przykład pies jest podtypem ssaka.
siamak

z punktu widzenia kompilatora tworzenie odniesień do interfejsu i używanie odniesień jest czymś prawdziwym i poprawnym. / ALE / IT nie jest pojęciem równym z podtypami w relacji dziedziczenia. I myślę, że nazywanie implementatorów interfejsu jako podtypów jest tak niezręczne i naprawdę nieprawdziwe.
siamak

Przykład polimorfizmu opartego na dziedziczeniu dobrze by się nadawał do objaśnienia tej odpowiedzi.
Marcelo Mason

5

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ł.


5

polimorfizm == wiele klas + te same sygnatury metod + zachowanie specyficzne dla klasy.




2

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


2

Polimorfizm to cecha języków programowania, która pozwala traktować obiekt jako instancję jego nadtypu.


Downvoter - Czy mógłbyś wyjaśnić dlaczego?
TarkaDaal

1

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


1

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.


1

Polimorfizm na niższym poziomie to możliwość wywołania metod, które są zdefiniowane przez implementatorów interfejsu z instancji interfejsu.


1

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.


1

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


0

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:

List list = new List();

ale jeśli sprawdzisz IList, możesz skorzystać z interfejsu jako:

IList list = new List();

i IListswobodnie korzystaj z odniesienia. Zakładając, że IListjest również zaimplementowana w innej klasie, możesz użyć metod tej nieznanej klasy poprzez ponowne IListodwoł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(i overridesł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.


1
To więcej niż 2 zdania.
Niebezpieczne

0

Dla danego podpisu metody są uruchamiane różne implementacje metod dla różnych, powiązanych hierarchicznie klas.


0

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.


0

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


0

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.


-2

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.


-2

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”.


Dlaczego ktoś to zaznaczył - to „dosłowna odpowiedź” ze strony internetowej National Instrument na temat polimorfizmu !!!
J-Dizzle

-3

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ę.


W rzeczywistości polimorfizm oznacza, że ​​instancje różnych klas są postrzegane jako typ wspólny i był w stanie używać metod zadeklarowanych w tym typie niezależnie od tego, jak różne klasy implementują te metody.
GaRRaPeTa
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.