Co to jest polimorfizm, do czego służy i jak się go stosuje?

564

Co to jest polimorfizm, do czego służy i jak się go stosuje?

UnkwnTech
źródło
19
@John: +1 Zgadzam się, że to najciekawsze zjawisko. Jestem pewien, że Unkwntech nie jest jedyną znaną, zdolną osobą do posiadania luk w tym, co inni uznaliby za podstawowe słownictwo. Po prostu pokazuje, że programowanie jest bardzo szerokim tematem.
AnthonyWJones
9
Mógłby go użyć, ale nie nadać mu nazwy.
Aiden Bell
10
@Airir: Nie jestem pewien, czy uzasadnione jest założenie, że ktoś z 8k znałby wszystkie podstawy we wszystkich obszarach programowania. Nie sądzę też, by wskazywało to na niedoskonałość systemu reputacji. Ktoś może zyskać znaczną reputację, zadając wiele dobrych pytań. Myślę, że nasza naturalna reakcja na to objawienie po prostu pokazuje, że my (programiści) mamy naturalną tendencję do bycia trochę zawężonymi (nie jest to zła rzecz, kiedy musimy być naprawdę dobrzy w jakimś konkretnym obszarze technicznym) i ma to swoje wady.
AnthonyWJones
43
Wygląda na to, że macie ograniczony pogląd na programowanie. Znam facetów, którzy zajmują się tworzeniem oprogramowania wbudowanego, którzy w ogóle nie znają (lub nie potrzebują) koncepcji OO. Ich celem jest wyciśnięcie z kodu każdego ostatniego atomu wydajności i to wszystko - kod, nad którym pracują, nigdy nie wejdzie w świat obiektów i na szczęście są wystarczająco blisko, aby przejść na emeryturę, o którą nie muszą się martwić uczenie się nowomodnych pojęć, takich jak obiekty, polimorfizm i nazwy zmiennych zawierające więcej niż dwie litery :-)
paxdiablo
29
Jak mają się czegoś nauczyć? Nikt nie przyszedł na ten świat znając OOP PHP i wzorce projektowe, więc każdy z was musiał kiedyś się go nauczyć, na studiach, tutaj odpowiedź itp. Nie mów o kimś, kto „odważył się nie znać skomplikowanych procedur kodu ”, a zamiast tego uważają, że chcą się tego nauczyć, co jest dobrą rzeczą i celem tej witryny. Wykorzystaj swój czas, pomagając im, bo jestem pewien , że w przeszłości pomogłeś. Gdyby w całej historii człowieka, zamiast dzielić się wiedzą, odpowiedź brzmiała: „Co? Ha! Nie wiesz o tym? ..” wszyscy bylibyśmy w ciemnych czasach…
James

Odpowiedzi:

544

Jeśli pomyślisz o greckich korzeniach tego terminu, powinno stać się oczywiste.

  • Poli = wiele: wielokąt = wielostronny, polistyren = wiele styrenów (a) , polyglot = wiele języków i tak dalej.
  • Morf = zmiana lub forma: morfologia = badanie formy biologicznej, Morfeusz = grecki bóg snów, który może przyjąć dowolną formę.

Zatem polimorfizm to zdolność (w programowaniu) do przedstawienia tego samego interfejsu dla różnych podstawowych formularzy (typów danych).

Na przykład w wielu językach liczby całkowite i liczby zmiennoprzecinkowe są domyślnie polimorficzne, ponieważ można dodawać, odejmować, pomnażać itd., Niezależnie od tego, że typy są różne. Rzadko uważa się je za przedmioty w zwykłym znaczeniu.

Ale w takim sam sposób, jak klasa BigDecimallub Rationalczy Imaginarymoże również świadczyć te operacje, chociaż działają one na różnych typach danych.

Klasycznym przykładem jest Shapeklasa i wszystkie klasy, które mogą z niej odziedziczyć (kwadrat, koło, dwunastościan, nieregularny wielokąt, ikona itp.).

W przypadku polimorfizmu każda z tych klas będzie miała inne podstawowe dane. Kształt punktowy wymaga tylko dwóch współrzędnych (oczywiście przy założeniu, że znajduje się w dwuwymiarowej przestrzeni). Okrąg potrzebuje środka i promienia. Kwadrat lub prostokąt wymaga dwóch współrzędnych dla lewego górnego i prawego dolnego rogu i (ewentualnie) obrotu. Nieregularny wielokąt potrzebuje szeregu linii.

Uczyniwszy klasę odpowiedzialną za kod i dane, można osiągnąć polimorfizm. W tym przykładzie każda klasa miałaby swoją Draw()funkcję, a kod klienta mógłby po prostu zrobić:

shape.Draw()

aby uzyskać prawidłowe zachowanie dla dowolnego kształtu.

Jest to w przeciwieństwie do starego sposobu robienia rzeczy, w których kod był oddzielony od danych, a miałbyś takie funkcje jak drawSquare()i drawCircle().

Orientacja obiektu, polimorfizm i dziedziczenie są ściśle powiązanymi pojęciami i należy je znać. Podczas mojej długiej kariery było wiele „srebrnych pocisków”, które właściwie po prostu wygasły, ale paradygmat OO okazał się dobry. Naucz się, rozumiem, uwielbiam - będziesz zadowolony, że to zrobiłeś :-)


(a) Pierwotnie napisałem to jako żart, ale okazało się, że jest poprawne i dlatego nie jest tak śmieszne. Monomeru styrenu stanie być wykonane z węgla i wodoru , a polistyren jest z grupy, że .C8H8(C8H8)n

Być może powinienem był powiedzieć, że polip występował wielokrotnie w liście, pchociaż teraz, gdy musiałem wyjaśnić dowcip, nawet to nie wydaje się śmieszne.

Czasami powinieneś po prostu wyjść, gdy jesteś w tyle :-)

paxdiablo
źródło
50
Grecki, a nie łaciński :) („y” i „ph” to prezenty). A w języku greckim „morph-” to po prostu „kształt” lub „forma” - angielskie znaczenie „ zmiana kształtu” dla „przekształcenia” jest późniejszym rozwinięciem
AakashM
16
Polimorfizm nie jest związany z OOP, ale OOP jest związany z polimorfizmem, ponieważ z natury go wspiera (zakładając, że jest to przyzwoity język OOP). Spójrz na FP na inne przykłady polimorfizmu.
alternatywny
9
Te dwie linie zrobiły dla mnie lewę:Poly = many and Morph = change or form
Jo Smo
3
Polyp to skrót od polypo (u) s. I pous jest stopą po grecku. ;-)
Dirk
2
@Shaun, myślę, że możesz używać terminu „interfejs” w zdecydowanie zbyt dosłownym / zwężającym się znaczeniu - miałem na myśli raczej termin angielski niż definicję specyficzną dla jakiegoś arbitralnego języka komputerowego. Nie oznacza to dokładnie tej samej funkcji z dokładnie tymi samymi parametrami, to po prostu sposób wpływania na „obiekty” w ten sam sposób, niezależnie od ich konkretnego typu betonu. Może to obejmować przeciążenie metod różnymi typami parametrów, a także bardziej czystą formę polimorfizmu.
paxdiablo
250

Polimorfizm polega na tym, że można traktować obiekt jako ogólną wersję czegoś, ale gdy uzyskuje się do niego dostęp, kod określa, jaki jest dokładnie typ i wywołuje powiązany kod.

Oto przykład w języku C #. Utwórz cztery klasy w aplikacji konsoli:

public abstract class Vehicle
{
    public abstract int Wheels;
}

public class Bicycle : Vehicle
{
    public override int Wheels()
    {
        return 2;
    }
}

public class Car : Vehicle
{
    public override int Wheels()
    {
        return 4;
    }
}

public class Truck : Vehicle
{
    public override int Wheels()
    {
        return 18;
    }
}

Teraz utwórz następujące polecenie w Main () modułu dla aplikacji konsoli:

public void Main()
{
    List<Vehicle> vehicles = new List<Vehicle>();

    vehicles.Add(new Bicycle());
    vehicles.Add(new Car());
    vehicles.Add(new Truck());

    foreach (Vehicle v in vehicles)
    {
        Console.WriteLine(
            string.Format("A {0} has {1} wheels.",
                v.GetType().Name, v.Wheels));
    }
}

W tym przykładzie tworzymy listę klasy podstawowej Vehicle, która nie wie, ile kół ma każda z jej podklas, ale wie, że każda podklasa jest odpowiedzialna za wiedzieć, ile ma kół.

Następnie dodajemy rower, samochód i ciężarówkę do listy.

Następnie możemy zapętlić każdy pojazd na liście i traktować je wszystkie identycznie, jednak gdy uzyskujemy dostęp do właściwości każdego koła pojazdu, klasa pojazdu przekazuje wykonanie tego kodu odpowiedniej podklasie.

Mówi się, że ten kod jest polimorficzny, ponieważ dokładny kod, który jest wykonywany, jest określony przez podklasę, do której odwołuje się w czasie wykonywania.

Mam nadzieję, że to ci pomoże.

Antony Gibbs
źródło
6
Myślę, że jest to bardzo dobry przykład na wyraźne pokazanie interfejsu nadrzędnego i że dopiero po utworzeniu instancji obiektu wymagana jest konkretna wersja, tj. Pojazd vs samochód
przewodowy
1
Powiedziałbym, że to najczystszy przykład, ale jeśli jesteś programistą PHP, ten link może być łatwiejszy do przejrzenia PIERWSZY, a następnie nadal spójrz na ten po: code.tutsplus.com/tutorials/...
Oliver Williams
Należy również (poza zakresem PO) zauważyć, że ograniczamy analizę do znanych obiektów; nie przekazujemy obiektu (np. pliku importu), a następnie nie określamy jego typu (Excel, CSV, YAML, SQL itp.). Aby to zrobić, potrzebna byłaby klasa fabryczna Class_Excel, Class_CSVdo której można by ją wywołać lub mieć Readerklasę o nazwie. Tak czy inaczej, jakiś rodzaj iteracji, jeśli / to / else będzie musiał gdzieś być przechowywany.
Oliver Williams,
@Antony Gibbs: to naprawdę dobry przykład (lista typów ogólnych), który ma dla mnie sens ... w przeciwnym razie, czym jest duża zaleta, że ​​każda klasa ma własną funkcję kół bez dziedziczenia po klasie podstawowej? Czy poza listą są jeszcze jakieś pojęcia, które byłyby dobre dla polimorfii?
TTT
195

Dzięki zrozumieniu i zastosowaniu polimorfizmu w PHP , dzięki Steve Guidetti.

Polimorfizm to długie słowo określające bardzo prostą koncepcję.

Polimorfizm opisuje wzorzec w programowaniu obiektowym, w którym klasy mają różne funkcje, współużytkując wspólny interfejs.

Piękno polimorfizmu polega na tym, że kod działający z różnymi klasami nie musi wiedzieć, z której klasy korzysta, ponieważ wszystkie są używane w ten sam sposób. Prawdziwa światowa analogia do polimorfizmu to przycisk. Wszyscy wiedzą, jak używać przycisku: po prostu naciskaj na niego. To, co „robi” przycisk, zależy jednak od tego, z czym jest połączone i kontekstu, w którym jest używane - ale wynik nie wpływa na sposób jego użycia. Jeśli twój szef każe ci nacisnąć przycisk, masz już wszystkie informacje potrzebne do wykonania zadania.

W świecie programowania polimorfizm jest wykorzystywany do uczynienia aplikacji bardziej modułowymi i rozszerzalnymi. Zamiast niechlujnych instrukcji warunkowych opisujących różne kierunki działania, tworzysz wymienne obiekty, które wybierasz na podstawie swoich potrzeb. To jest podstawowy cel polimorfizmu.

Ajay Patel
źródło
10
czy analogia przycisku nie jest bardziej związana z pojęciem abstrakcji?
thewpfguy
6
Oryginalne źródło: code.tutsplus.com/tutorials/…
Ktoś
8
@ Mantriur: To jest rzeczywiście plagiat, a my mamy wobec tego reguły: stackoverflow.com/help/referencing Ale biorąc pod uwagę jego wynik teraz i fakt, że stare posty są zwolnione z utraty powtórzeń po usunięciu odpowiedzi, nie jestem pewien, czy to usuwam teraz wprost poprawiłoby wszystko. Kolejną najlepszą alternatywą byłoby po prostu edytowanie atrybucji w imieniu użytkownika, chociaż mocno wierzę, że użytkownicy są odpowiedzialni za cytowanie źródeł we własnych odpowiedziach.
BoltClock
1
Uważam, że niewłaściwe jest sugerowanie, że polimorfizm jest specyficzny dla klas i / lub programowania obiektowego, biorąc pod uwagę, że polimorfizm ad hoc lub polimorfizm parametryczny niekoniecznie wymaga klas i / lub obiektów. Myślę, że to, o czym mówi ta odpowiedź, to podtyp (znany również jako polimorfizm podtypu lub polimorfizm inkluzyjny).
StubbornShowaGuy
64

Jeśli ktoś powie CUT tym osobom

  1. Chirurg
  2. Stylista włosów
  3. Aktor

Co się stanie?

  • Chirurg zaczął robić nacięcie.
  • Stylista włosów zacznie obcinać czyjeś włosy.
  • Aktor nagle przestał działać poza bieżącą sceną, czekając na wskazówki reżyserskie.

Tak więc powyższa reprezentacja pokazuje Co to jest polimorfizm (ta sama nazwa, inne zachowanie) w OOP.

Jeśli wybierasz się na rozmowę, a ankieter prosi o przekazanie / pokazanie żywego przykładu polimorfizmu w tym samym pokoju, w którym siedzimy,

Odpowiedź - Drzwi / Windows

Zastanawiasz się jak?

Przez drzwi / okno - osoba może przyjść, może przyjść powietrze, może przyjść światło, może przyjść deszcz itp.

Aby to lepiej zrozumieć i w prosty sposób użyłem powyższego przykładu. Jeśli potrzebujesz referencji do kodu, postępuj zgodnie z powyższymi odpowiedziami.

Sanchit
źródło
5
Nie sądzę, że jest to świetny przykład, ponieważ może prowadzić niedoświadczonych ludzi do myślenia, że ​​jeśli dwie klasy mają .foo()metodę, to powinny one mieć wspólny interfejs. Nie jest to jednak prawdą i prowadzi do nieprawidłowych abstrakcji. Interfejs powinien określać rolę, która ma być odgrywana, która może mieć wiele różnych implementacji, ale wszystkie pobierają z tego samego zestawu danych wejściowych i zwracają coś z tego samego zestawu danych wyjściowych. Dane wejściowe x.cut(...)dla chirurga, stylisty lub aktora nie są takie same, podobnie jak wyniki.
Matt Klein
37

Proste objaśnienie przez analogię

Prezydent Stanów Zjednoczonych stosuje polimorfizm. W jaki sposób? Cóż, ma wielu doradców:

  1. Doradcy wojskowi
  2. Radcy prawni
  3. Fizycy jądrowi (jako doradcy)
  4. Doradcy medyczni
  5. itd itd.

Każdy powinien być odpowiedzialny tylko za jedną rzecz: Przykład:

Prezydent nie jest ekspertem w dziedzinie cynkowania ani fizyki kwantowej. Nie wie wielu rzeczy - ale wie tylko jedno: jak rządzić krajem.

Podobnie jest z kodem: obawy i obowiązki powinny być rozdzielone na odpowiednie klasy / osoby. W przeciwnym razie prezydent miałby dosłownie wszystko na świecie - całą Wikipedię. Wyobraź sobie, że cała wikipedia znajduje się w klasie twojego kodu: utrzymanie go byłoby koszmarem.

Dlaczego to zły pomysł, żeby prezydent wiedział o tych wszystkich konkretnych sprawach?

Gdyby prezydent konkretnie powiedział ludziom, co ma robić, oznaczałoby to, że prezydent musi wiedzieć dokładnie , co robić. Jeśli prezydent musi sam wiedzieć konkretne rzeczy, oznacza to, że kiedy trzeba dokonać zmiany, trzeba ją wprowadzić w dwóch miejscach, a nie w jednym.

Na przykład, jeśli EPA zmieni przepisy dotyczące zanieczyszczenia, to kiedy tak się stanie: będziesz musiał zmienić klasę EPA, a także klasę prezydenta. Zmiana kodu w dwóch miejscach zamiast w jednym może być niebezpieczna - ponieważ jest o wiele trudniejsza w utrzymaniu.

Czy istnieje lepsze podejście?

Istnieje lepsze podejście: prezydent nie musi znać specyfiki czegokolwiek - może zażądać najlepszej porady od osób, którym powierzono konkretne zadanie.

Potrafi zastosować polimorficzne podejście do kierowania krajem.

Przykład - zastosowania podejścia polimorficznego:

Jedyne, co robi prezydent, to prosić ludzi, aby mu doradzali - i tak właśnie robi w prawdziwym życiu - i to właśnie powinien zrobić dobry prezydent. wszyscy jego doradcy reagują inaczej, ale wszyscy wiedzą, co prezydent ma na myśli: Advise (). Setki ludzi strumieniuje do jego biura. Nie ma znaczenia, kim oni są. Prezydent wie tylko, że kiedy prosi ich o „Doradztwo”, wie, jak odpowiednio odpowiedzieć :

public class MisterPresident
{
    public void RunTheCountry()
    {
        // assume the Petraeus and Condi classes etc are instantiated.
        petraeus.Advise(); // # Petraeus says send 100,000 troops to Fallujah
        condolezza.Advise(); // # she says negotiate trade deal with Iran
        healthOfficials.Advise(); // # they say we need to spend $50 billion on ObamaCare
    }
}

Takie podejście pozwala prezydentowi rządzić krajem dosłownie, nie wiedząc nic o sprawach wojskowych, opiece zdrowotnej czy dyplomacji międzynarodowej: szczegóły pozostawia się ekspertom. Jedyne, co prezydent musi wiedzieć, to: „Advise ()”.

Czego NIE CHCESZ:

public class MisterPresident
{
    public void RunTheCountry()
    {
        // people walk into the Presidents office and he tells them what to do
        // depending on who they are.

        // Fallujah Advice - Mr Prez tells his military exactly what to do.
        petraeus.IncreaseTroopNumbers();
        petraeus.ImproveSecurity();
        petraeus.PayContractors();

        // Condi diplomacy advice - Prez tells Condi how to negotiate

        condi.StallNegotiations();
        condi.LowBallFigure();
        condi.FireDemocraticallyElectedIraqiLeaderBecauseIDontLikeHim();

        // Health care

        healthOfficial.IncreasePremiums();
        healthOfficial.AddPreexistingConditions();
    }
}

NIE! NIE! NIE! W powyższym scenariuszu prezydent wykonuje całą pracę: wie o zwiększeniu liczby żołnierzy i wcześniejszych warunkach. Oznacza to, że jeśli zmieni się polityka Bliskiego Wschodu, prezydent będzie musiał zmienić swoje polecenia, a także klasę Petraeus. Powinniśmy tylko zmienić klasę Petraeusa, ponieważ Prezydent nie powinien być zmuszony do zagłębiania się w tego rodzaju szczegóły. Nie musi wiedzieć o szczegółach. Musi tylko wiedzieć, że jeśli złoży jedno zamówienie, wszystko zostanie załatwione. Wszystkie szczegóły należy pozostawić ekspertom.

To pozwala prezydentowi robić to, co robi najlepiej: ustalać ogólne zasady, dobrze wyglądać i grać w golfa: P.

Jak to jest faktycznie zaimplementowane - poprzez klasę bazową lub wspólny interfejs

To w efekcie polimorfizm w skrócie. Jak to się dokładnie robi? Poprzez „wdrożenie wspólnego interfejsu” lub użycie klasy podstawowej (dziedziczenie) - zobacz powyższe odpowiedzi, które szczegółowo to opisują. (Aby lepiej zrozumieć tę koncepcję, musisz wiedzieć, czym jest interfejs, i musisz zrozumieć, czym jest dziedzictwo. Bez tego możesz się zmagać).

Innymi słowy, Petraeus, Condi i HealthOfficials całości byłoby klasy, która „implementować interfejs” - nazwijmy to niech był na IAdvisorinterfejs, który zawiera tylko jedną metodę: Advise(). Ale teraz wchodzimy w szczegóły.

To byłoby idealne

    public class MisterPresident
    {
            // You can pass in any advisor: Condi, HealthOfficials,
            //  Petraeus etc. The president has no idea who it will 
            // be. But he does know that he can ask them to "advise" 
            // and that's all Mr Prez cares for.

        public void RunTheCountry(IAdvisor governmentOfficer)
        {             
            governmentOfficer.Advise();              
        }
    }


    public class USA
    {
        MisterPresident president;

        public USA(MisterPresident president)
        {
            this.president = president;
        }

        public void ImplementPolicy()
        {
            IAdvisor governmentOfficer = getAdvisor(); // Returns an advisor: could be condi, or petraus etc.
            president.RunTheCountry(governmentOfficer);
        }
    }

Podsumowanie

Wszystko, co naprawdę musisz wiedzieć, to:

  • Prezydent nie musi znać szczegółów - są one pozostawione innym.
  • Wszystko, co prezydent musi wiedzieć, to zapytać, kto kiedykolwiek wchodzi do drzwi, aby mu doradzić - i wiemy, że będą absolutnie wiedzieli, co zrobić, gdy zostaną poproszeni o radę (ponieważ wszyscy są w rzeczywistości doradcami (lub IAdvisors :))

Naprawdę mam nadzieję, że ci to pomoże. Jeśli nic nie rozumiesz, opublikuj komentarz, a ja spróbuję ponownie.

BKSpurgeon
źródło
4
Fantastyczny przykład! Dzięki.
Iman Sedighi
1
Bardzo interesująca analogia. Dziękuję Ci.
thanhtang
1
@TTT, ponieważ (1) za każdym razem, gdy masz nowego doradcę, musisz zmienić klasę prezydenta - nie chcesz wprowadzać zmian x2. tylko jeden. (2) po drugie, jeśli musisz zmienić istniejącego doradcę, być może będziesz musiał wrócić i zmienić jedno z tych trzech wezwań w klasie prezydenta - naprawdę chcesz tylko wprowadzić jedną zmianę, a nie dwie. (3) jeśli miałeś trzy osobne wezwania, musiałbyś zapytać w klasie prezydenta: if healthAdvisor? then do this:i if petraus then do that etc.ten schemat będzie musiał zostać powtórzony, co jest niepotrzebne i skomplikowane. patrz wyżej edycja.
BKSpurgeon
1
@TTT tak masz rację. ale muszę powoli przedstawiać tę koncepcję czytelnikom, w przeciwnym razie nie zrozumieją. dodałem dalsze zmiany. proszę doradzić, czy potrzebne są wyjaśnienia
BKSpurgeon
1
Klasa bazowa @TTT vs interfejs to decyzja, którą programiści muszą podjąć podczas wykonywania polimorfizmu. zobacz tutaj po więcej szczegółów: stackoverflow.com/questions/56867/interface-vs-base-class
BKSpurgeon
24

Polimorfizm to zdolność do traktowania klasy obiektu tak, jakby była klasą nadrzędną.

Załóżmy na przykład, że istnieje klasa Animal i klasa Dog, która dziedziczy od Animal. Polimorfizm to zdolność do traktowania dowolnego obiektu psa jako obiektu zwierzęcego w następujący sposób:

Dog* dog = new Dog;
Animal* animal = dog;
Tom Dalling
źródło
Zastanawiam się, jak to się ma do (popularnego) wyjaśnienia, które podał @Ajay Patelclasses have different functionality while sharing a common interface
BornToCode
1
@BornToCode Klasa nadrzędna to / zapewnia ten wspólny interfejs.
grokmann
1
Polimorfizm nie wymaga podtypu.
Shaun Luttin
22

Wielopostaciowość:

Jest to koncepcja programowania obiektowego. Zdolność różnych obiektów do reagowania, każdy na swój sposób, na identyczne komunikaty, nazywa się polimorfizmem.

Polimorfizm wynika z faktu, że każda klasa żyje we własnej przestrzeni nazw. Nazwy przypisane w definicji klasy nie powodują konfliktu z nazwami przypisanymi gdziekolwiek poza nią. Dotyczy to zarówno zmiennych instancji w strukturze danych obiektu, jak i metod obiektu:

  • Tak jak pola struktury C znajdują się w chronionej przestrzeni nazw, podobnie zmienne instancji obiektu.

  • Nazwy metod są również chronione. W przeciwieństwie do nazw funkcji C, nazwy metod nie są symbolami globalnymi. Nazwa metody w jednej klasie nie może kolidować z nazwami metod w innych klasach; dwie bardzo różne klasy mogą implementować metody o identycznych nazwach.

Nazwy metod są częścią interfejsu obiektu. Gdy wiadomość jest wysyłana z żądaniem, aby obiekt coś zrobił, nazwa określa metodę, którą obiekt powinien wykonać. Ponieważ różne obiekty mogą mieć metody o tej samej nazwie, znaczenie komunikatu należy rozumieć w odniesieniu do konkretnego obiektu, który odbiera komunikat. Ta sama wiadomość wysłana do dwóch różnych obiektów może wywoływać dwie różne metody.

Główną zaletą polimorfizmu jest to, że upraszcza interfejs programowania. Umożliwia ustanowienie konwencji, które mogą być ponownie wykorzystane w klasie po klasie. Zamiast wymyślać nową nazwę dla każdej nowej funkcji dodawanej do programu, można użyć tych samych nazw. Interfejs programistyczny można opisać jako zbiór zachowań abstrakcyjnych, całkiem oprócz klas, które je implementują.

Przykłady:

Przykład 1: W tym przykładzie jest prosty napisany w Python 2.x .

class Animal:
    def __init__(self, name):    # Constructor of the class
        self.name = name
    def talk(self):              # Abstract method, defined by convention only
        raise NotImplementedError("Subclass must implement abstract method")

class Cat(Animal):
    def talk(self):
        return 'Meow!'

class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'

animals = [Cat('Missy'),
           Dog('Lassie')]

for animal in animals:
    print animal.name + ': ' + animal.talk()

Przykład 2: Polimorfizm jest implementowany w Javie przy użyciu przeciążania metod i pojęć zastępujących metody .

Rozważmy przykład samochodu do dyskusji na temat polimorfizmu. Weź jakąkolwiek markę, taką jak Ford, Honda, Toyota, BMW, Benz itp., Wszystko jest typu Samochód.

Ale każdy z nich ma własne zaawansowane funkcje i bardziej zaawansowaną technologię związaną z ich ruchem.

Teraz stwórzmy podstawowy typ samochodu

Car.java

public class Car {

    int price;
    String name;
    String color;

    public void move(){
    System.out.println("Basic Car move");
    }

}

Zaimplementujmy przykład Ford Car.

Ford rozszerza typ samochodu o dziedziczenie wszystkich jego członków (właściwości i metody).

Ford.java

public class Ford extends Car{
  public void move(){
    System.out.println("Moving with V engine");
  }
}

Powyższa klasa Forda rozszerza klasę Car, a także implementuje metodę move (). Chociaż metoda przeniesienia jest już dostępna dla Forda poprzez Dziedziczenie, Ford wciąż wdrożył tę metodę na swój własny sposób. Nazywa się to przesłonięciem metody.

Honda.java

public class Honda extends Car{
  public void move(){
    System.out.println("Move with i-VTEC engine");
  }
}

Podobnie jak Ford, Honda rozszerza także typ samochodu i na swój sposób wdrożyła metodę ruchu.

Zastępowanie metod jest ważną funkcją umożliwiającą polimorfizm. Używając przesłonięcia metody, typy podrzędne mogą zmienić sposób działania metod, które są dostępne poprzez dziedziczenie.

PolimorfizmPrzykład.java

public class PolymorphismExample {
  public static void main(String[] args) {
    Car car = new Car();
    Car f = new Ford();
    Car h = new Honda();

    car.move();
    f.move();
    h.move();

  }
}

Przykładowy wynik polimorfizmu:

W głównej metodzie klasy PolymorphismExample stworzyłem trzy obiekty - Car, Ford i Honda. Wszystkie trzy obiekty są przypisane do typu samochodu.

Zwróćmy uwagę na ważną kwestię, że typ superklasy może odnosić się do typu obiektu podklasy, ale wice-wers nie jest możliwy. Powodem jest to, że wszyscy członkowie superklasy są dostępni do podklasy za pomocą dziedziczenia, a podczas kompilacji kompilator próbuje ocenić, czy używany przez nas typ odwołania ma metodę, do której próbuje uzyskać dostęp.

Tak więc dla referencji car, f i hw Polimorfizmie Przykładowo istnieje metoda przenoszenia z typu Car. Tak więc kompilator przechodzi proces kompilacji bez żadnych problemów.

Ale jeśli chodzi o wykonanie w czasie wykonywania, maszyna wirtualna wywołuje metody na obiektach, które są podtypami. Tak więc metoda move () jest wywoływana z ich odpowiednich implementacji.

Zatem wszystkie obiekty są typu Car, ale w czasie wykonywania wykonanie zależy od obiektu, na który ma miejsce wywołanie. Nazywa się to polimorfizmem.

Tony Stark
źródło
Koncepcja przeciążenia nie ma nic wspólnego z dziedziczeniem i polimorfizmem.
srk
@srk Przeciążenie metody jest jednym ze sposobów implementacji polimorfizmu. Często jest klasyfikowany jako polimorfizm statyczny lub ad hoc. wiki.c2.com/?CategoryPolymorphism
Shaun Luttin
12

Zwykle odnosi się to do zdolności obiektu typu A do zachowania się jak obiekt typu B. W programowaniu obiektowym jest to zwykle osiągane przez dziedziczenie. Niektóre linki do Wikipedii, aby przeczytać więcej:

EDYCJA: naprawiono uszkodzone linki.

JesperE
źródło
10
„zdolność obiektu typu A do zachowania się jak obiekt typu B” - nie jest to dokładna definicja. Powiedziałbym, że jest to bardziej umiejętność traktowania obiektu typu A tak, jakby to był obiekt typu B.
Artem Barger
Tak. Może to lepsze sformułowanie.
JesperE
Dla kompletności wiele języków implementuje polimorfizm poprzez pisanie kaczek, np. Python.
ilya n.
Zastanawiam się, w jaki sposób ma to związek z (popularnym) wyjaśnieniem udzielonym przez @Ajay Patelclasses have different functionality while sharing a common interface
BornToCode
9

Polimorfizm jest taki:

class Cup {
   int capacity
}

class TeaCup : Cup {
   string flavour
}

class CoffeeCup : Cup {
   string brand
}

Cup c = new CoffeeCup();

public int measure(Cup c) {
    return c.capacity
}

możesz przekazać tylko Puchar zamiast konkretnej instancji. Pomaga to w ogólności, ponieważ nie trzeba podawać konkretnej instancji Measure () dla każdego typu kubka

Vinko Vrsalovic
źródło
2
Jest to szczególnie polimorfizm podtypu.
Shaun Luttin
@ vinko-vrsalovic: jak wygląda tworzenie oprogramowania na obszarach wiejskich w Ameryce?
TTT
8

Wiem, że to jest starsze pytanie z wieloma dobrymi odpowiedziami, ale chciałbym podać odpowiedź w jednym zdaniu:

Traktowanie typu pochodnego tak, jakby był to typ podstawowy.

Powyżej jest wiele przykładów, które pokazują to w działaniu, ale uważam, że to dobra zwięzła odpowiedź.

Abe Miessler
źródło
2
To jest podtyp, który jest tylko jednym rodzajem polimorfizmu.
Shaun Luttin
@ShaunLuttin, czy możesz wskazać mi jakieś zasoby, aby dowiedzieć się więcej o innych typach polimorfizmu?
Abe Miessler
Są to „polimorfizm ad hoc” i „polimorfizm parametryczny” oprócz „polimorfizmu podtypu”.
Shaun Luttin
8

(Przeglądałem kolejny artykuł na coś zupełnie innego ... i pojawił się polimorfizm ... Teraz pomyślałem, że wiem, czym jest polimorfizm ... ale najwyraźniej nie w ten piękny sposób wyjaśniony ... Chciałem gdzieś to zapisać ... lepiej nadal będzie to udostępniać ...)

http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife

czytaj dalej z tej części:

..... polimorfizm. To jest naukowy sposób na powiedzenie, że różne rzeczowniki mogą mieć do nich ten sam czasownik.

Kcats Wolfrevo
źródło
5

Ogólnie rzecz biorąc, jest to zdolność do interfejsu wielu różnych typów obiektów przy użyciu tego samego lub powierzchownie podobnego API. Istnieją różne formy:

  • Przeciążenie funkcji: zdefiniowanie wielu funkcji o tej samej nazwie i różnych typach parametrów, takich jak sqrt (zmiennoprzecinkowy), sqrt (podwójny) i sqrt (złożony). W większości języków, które to umożliwiają, kompilator automatycznie wybiera poprawny typ argumentu, który jest do niego przekazywany, dlatego jest to polimorfizm w czasie kompilacji.

  • Metody wirtualne w OOP: metoda klasy może mieć różne implementacje dostosowane do specyfiki jej podklas; każdy z nich zastępuje implementację podaną w klasie bazowej. Biorąc pod uwagę obiekt, który może należeć do klasy podstawowej lub dowolnej jego podklasy, poprawna implementacja jest wybierana w locie, a więc jest to polimorfizm w czasie wykonywania.

  • Szablony: funkcja niektórych języków OO, w której funkcję, klasę itp. Można sparametryzować według typu. Na przykład możesz zdefiniować ogólną klasę szablonów „list”, a następnie utworzyć ją jako „listę liczb całkowitych”, „listę ciągów znaków”, a może nawet „listę list ciągów znaków” lub tym podobne. Zasadniczo kod pisze się raz dla struktury danych o dowolnym typie elementu, a kompilator generuje jego wersje dla różnych typów elementów.

Stewart
źródło
4

Termin polimorfizm pochodzi od:

poli = wiele

morfizm = zdolność do zmiany

W programowaniu polimorfizm jest „techniką”, która pozwala „spojrzeć” na obiekt jako na więcej niż jeden rodzaj rzeczy. Na przykład:

Obiekt studencki to także obiekt osobisty. Jeśli „spojrzysz” (tj. Obsada) na ucznia, prawdopodobnie możesz poprosić o jego identyfikator. Nie zawsze możesz to zrobić z osobą, prawda? (osoba niekoniecznie jest studentem, dlatego może nie mieć legitymacji studenckiej). Jednak osoba prawdopodobnie ma imię. Student też.

Podsumowując, „patrzenie” na ten sam obiekt pod różnymi „kątami” może dać ci różne „perspektywy” (tj. Różne właściwości lub metody)

Ta technika pozwala więc budować rzeczy, na które można „spojrzeć” z różnych punktów widzenia.

Dlaczego używamy polimorfizmu? Na początek ... abstrakcja. W tym momencie powinno wystarczyć wystarczająca ilość informacji :)

tzup
źródło
3

Użyjmy analogii. Dla danego scenariusza muzycznego każdy muzyk, który go gra, ma swój własny akcent w interpretacji.

Muzykę można wyabstrahować za pomocą interfejsów, gatunek, do którego należy muzyk, może być klasą abstrac, która określa globalne reguły interpretacji, a każdego muzyka, który gra, można wymodelować za pomocą konkretnej klasy.

Jeśli jesteś słuchaczem dzieła muzycznego, masz odniesienie do scenariusza, np. „Fuga i Tocata” Bacha, a każdy muzyk, który go wykonuje, robi to polimorficznie na swój sposób.

To tylko przykład możliwego projektu (w Javie):

public interface Musician {
  public void play(Work work);
}

public interface Work {
  public String getScript();
}

public class FugaAndToccata implements Work {
  public String getScript() {
    return Bach.getFugaAndToccataScript();
  }
}

public class AnnHalloway implements Musician {
  public void play(Work work) {
    // plays in her own style, strict, disciplined
    String script = work.getScript()
  }
}

public class VictorBorga implements Musician {
  public void play(Work work) {
    // goofing while playing with superb style
    String script = work.getScript()
  }
}

public class Listener {
  public void main(String[] args) {
    Musician musician;
    if (args!=null && args.length > 0 && args[0].equals("C")) {
      musician = new AnnHalloway();
    } else {
      musician = new TerryGilliam();
    }
    musician.play(new FugaAndToccata());
}
Boris Pavlović
źródło
1
AnnHallowayi VictorBorgaczuję, że powinny być obiektami, a nie klasami - twój przykład lepiej czytałby z np. public class Pianist implements Musiciani victorBorge = new Pianist();itp.
Przemek D
3

Przedstawiłem ogólny przegląd polimorfizmu dla innego pytania:

Polimorfizm w c ++

Mam nadzieję, że to pomoże. Ekstrakt...

... pomaga zacząć od prostego testu i definicji [polimorfizmu]. Rozważ kod:

Type1 x;
Type2 y;

f(x);
f(y);

Tutaj f()ma wykonać jakąś operację i otrzymuje wartości xi ydane wejściowe. Aby być polimorficznym, f()musi być w stanie działać z wartościami co najmniej dwóch różnych typów (np. intI double), znajdując i wykonując odpowiedni kod.

(ciąg dalszy na Polimorfizm w c ++ )

Tony Delroy
źródło
3

Polimorfizm to zdolność obiektu, którą można przyjmować w wielu formach. Na przykład w klasie ludzkiej mężczyzna może działać w wielu formach, gdy mówimy o związkach. EX: Mężczyzna jest ojcem syna, a mąż jego żony i nauczycielem swoich uczniów.

Rohit
źródło
3

Polimorfizm to zdolność obiektu do przyjmowania wielu form. Najczęstsze zastosowanie polimorfizmu w OOP występuje, gdy odwołanie do klasy nadrzędnej jest używane do odwołania do obiektu klasy podrzędnej. W tym przykładzie napisanym w Javie mamy trzy typy pojazdów. Tworzymy trzy różne obiekty i próbujemy uruchomić ich metodę kół:

public class PolymorphismExample {

    public static abstract class Vehicle
    {
        public int wheels(){
            return 0;
        }
    }

    public static class Bike extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 2;
        }
    }

    public static class Car extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 4;
        }
    }

    public static class Truck extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 18;
        }
    }

    public static void main(String[] args)
    {
        Vehicle bike = new Bike();
        Vehicle car = new Car();
        Vehicle truck = new Truck();

        System.out.println("Bike has "+bike.wheels()+" wheels");
        System.out.println("Car has "+car.wheels()+" wheels");
        System.out.println("Truck has "+truck.wheels()+" wheels");
    }

}

Wynik to:

Wynik

Aby uzyskać więcej informacji, odwiedź https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java . Mam nadzieję, że to pomoże.

Mohammad
źródło
Tak, ale nie wyjaśniłeś, jakie są zalety polimorfizmu. Jest oczywiście krótszy kod, w którym usunąłbyś klasę Vehicle i nadal działałby (oczywiście z deklaracją innego obiektu).
Cornelius,
Nie wyjaśniłem, ponieważ osoba, która zadała pytanie, nie pytała o korzyści. Zapytał: „Czym jest polimorfizm, do czego służy i jak się go stosuje?”. O kodzie, jeśli możesz to zrobić lepiej, opublikuj swoją odpowiedź. Nasza społeczność może z niego korzystać. Dzięki za komentarz.
Mohammad
Niestety, nie chciałem zabrzmieć niegrzecznie, inni też tego nie wyjaśnili. Przynajmniej próbowałeś wpisać kod. W każdym razie zapytał, po co to jest, ale żaden z przykładów na tej stronie nie wyjaśnia, po co to jest. Wszyscy przedstawiliście tylko złożony sposób na uzyskanie takich samych rezultatów jak to: s28.postimg.org/jq8vl6031/Poly.jpg i nikt nie chciał wyjaśnić, dlaczego miałby chcieć używać polimorfizmu, jaki jest jego zysk lub cel, czego nie mógł zostało zrobione, jeśli nie zostało użyte? Na tej stronie widzę tylko propozycję wspinania się po schodach do swojego mieszkania, a nie windę.
Cornelius,
.. nie zauważając, że niesie się maszt flagowy, który jest zbyt duży, aby zmieścił się w windzie. Nie wiem, jak napisać kod, więc nie mogę nic
Cornelius,
2

Polimorfizm to zdolność programisty do pisania metod o tej samej nazwie, które wykonują różne czynności dla różnych typów obiektów, w zależności od potrzeb tych obiektów. Na przykład, jeśli tworzysz klasę o nazwie Fractioni klasę o nazwie ComplexNumber, obie z nich mogą zawierać metodę o nazwie display(), ale każda z nich implementowałaby tę metodę inaczej. Na przykład w PHP możesz to zaimplementować w następujący sposób:

//  Class definitions

class Fraction
{
    public $numerator;
    public $denominator;

    public function __construct($n, $d)
    {
        //  In real life, you'd do some type checking, making sure $d != 0, etc.
        $this->numerator = $n;
        $this->denominator = $d;
    }

    public function display()
    {
        echo $this->numerator . '/' . $this->denominator;
    }
}

class ComplexNumber
{
    public $real;
    public $imaginary;

    public function __construct($a, $b)
    {
        $this->real = $a;
        $this->imaginary = $b;
    }

    public function display()
    {
        echo $this->real . '+' . $this->imaginary . 'i';
    }
}


//  Main program

$fraction = new Fraction(1, 2);
$complex = new ComplexNumber(1, 2);

echo 'This is a fraction: '
$fraction->display();
echo "\n";

echo 'This is a complex number: '
$complex->display();
echo "\n";

Wyjścia:

This is a fraction: 1/2
This is a complex number: 1 + 2i

Niektóre inne odpowiedzi wydają się sugerować, że polimorfizm jest używany tylko w połączeniu z dziedziczeniem; na przykład być może Fractioni ComplexNumberobie implementują klasę abstrakcyjną o nazwie, Numberktóra ma metodę display(), którą Fraction i ComplexNumber są następnie zobowiązane do implementacji. Ale nie potrzebujesz dziedziczenia, aby skorzystać z polimorfizmu.

Przynajmniej w dynamicznie pisanych językach, takich jak PHP (nie wiem o C ++ lub Javie), polimorfizm pozwala deweloperowi wywołać metodę bez konieczności znajomości typu obiektu z wyprzedzeniem i ufając, że poprawna implementacja metody będzie Zostać wezwanym. Załóżmy na przykład, że użytkownik wybiera typ Numberutworzonego:

$userNumberChoice = $_GET['userNumberChoice'];

switch ($userNumberChoice) {
    case 'fraction':
        $userNumber = new Fraction(1, 2);
        break;
    case 'complex':
        $userNumber = new ComplexNumber(1, 2);
        break;
}

echo "The user's number is: ";
$userNumber->display();
echo "\n";

W takim przypadku display()zostanie wywołana odpowiednia metoda, nawet jeśli programista nie będzie wiedział z góry, czy użytkownik wybierze ułamek, czy liczbę zespoloną.

Alex Basson
źródło
2
To nie jest polimorfizm. To dwie klasy posiadające metody o tej samej nazwie. Musiałyby być połączone klasą bazową lub interfejsem zwanym „wyświetlalnym” lub czymś podobnym, a wtedy inne metody po prostu dbałyby o to, aby obiekt był typu „wyświetlalny”, a nie złożony lub frakcyjny.
Pod
Zawsze myślałem, że polimorfizm to „dwie klasy posiadające metody tego samego imienia”. W rzeczywistości, cytując Stephana Kochana (od którego jestem bezwstydny odrywając ten przykład Frakcja / Złożony), „zdolność do dzielenia tej samej nazwy metody w różnych klasach jest znana jako polimorfizm”. (z Programming_In_Objective-C ) Nie wspomina o żadnej potrzebie łączenia klas poprzez klasę podstawową. Może jest inaczej w różnych językach, szczerze mówiąc nie wiem.
Alex Basson
Nawet pomimo tego, że ta obrona jest cytowana z opublikowanej książki, nadal twierdzę, że jest niepoprawna. Zwłaszcza, że ​​wydaje się, że koliduje ono ze wszystkimi, językowo agnostycznymi obronami polimorfizmu. I chociaż wynik końcowy jest taki sam, jak w przypadku polimorfizmu, argumentowałbym, że zamiast tego dynamiczne pisanie pozwala programiście na sprawdzenie, czy wywoływana jest poprawna implementacja metody wśród innych podobnych metod.
vipirtti
2

W programowaniu obiektowym polimorfizm odnosi się do zdolności języka programowania do przetwarzania obiektów w różny sposób w zależności od ich typu danych lub klasy . Mówiąc dokładniej, jest to zdolność do redefiniowania metod dla klas pochodnych.

sjith
źródło
2

Polimorfizm dosłownie oznacza wiele kształtów. (lub wiele postaci): Obiekt z różnych klas i metoda o tej samej nazwie, ale przepływy pracy są różne. Prostym przykładem byłoby:

Rozważ osobę X.

Jest tylko jedną osobą, ale działa tak samo. Możesz zapytać, jak:

Jest synem swojej matki. Przyjaciel dla swoich przyjaciół. Brat dla swojej siostry.

Shourob Datta
źródło
2

Polimorfizm w OOP oznacza, że ​​klasa może mieć różne typy, dziedziczenie jest jednym ze sposobów implementacji polimorfizmu.

na przykład Shape jest interfejsem, ma kwadrat , koło , podtypy Diament . teraz masz obiekt Kwadrat, możesz automatycznie zmienić kwadrat na Kształt, ponieważ Kwadrat jest Kształtem. Ale kiedy próbujesz obniżyć kształt do kwadratu, musisz wykonać rzut typu jawnego, ponieważ nie można powiedzieć, że kształt jest kwadratem, może to być również koło. więc musisz ręcznie rzucić go za pomocą kodu Square s = (Square)shape, co jeśli kształt ma kształt Koło, otrzymasz java.lang.ClassCastException, ponieważ Okrąg nie jest Kwadratem.

Frank Zhang
źródło
2

Wielopostaciowość:

Różne wykonanie w zależności od instancji klasy, a nie typu zmiennej referencyjnej.

Zmienna referencyjna typu interfejsu może odnosić się do dowolnej instancji klasy, która implementuje ten interfejs.

Hassan Tareq
źródło
1

Polimorfizm to zdolność do używania obiektu w danej klasie, w której wszystkie komponenty tworzące obiekt są dziedziczone przez podklasy danej klasy. Oznacza to, że gdy obiekt zostanie zadeklarowany przez klasę, wszystkie podklasy poniżej (i ich podklasy itd., Aż do osiągnięcia najdalszej / najniższej podklasy) dziedziczą obiekt i jego komponenty (makijaż).

Pamiętaj, że każda klasa musi być zapisana w osobnych plikach.

Poniższy kod ilustruje polimorfizm:

SuperClass:

public class Parent {
    //Define things that all classes share
    String maidenName;
    String familyTree;

    //Give the top class a default method
    public void speak(){
         System.out.println("We are all Parents");
    }
}

Ojciec, podklasa:

public class Father extends Parent{
    //Can use maidenName and familyTree here
    String name="Joe";
    String called="dad";

    //Give the top class a default method
    public void speak(){
        System.out.println("I am "+name+", the father.");
    }
}

Dziecko, kolejna podklasa:

public class Child extends Father {
    //Can use maidenName, familyTree, called and name here

    //Give the top class a default method
    public void speak(){
        System.out.println("Hi "+called+". What are we going to do today?");
    }
}

Metoda wykonania odwołuje się do klasy nadrzędnej, aby rozpocząć:

public class Parenting{
    public static void main(String[] args) {
        Parent parents = new Parent();
        Parent parent = new Father();
        Parent child = new Child();

        parents.speak();
        parent.speak();
        child.speak();
    }
}

Pamiętaj, że każdą klasę należy zadeklarować w osobnych plikach * .java. Kod powinien się skompilować. Zauważ też, że możesz dalej używać maidenName i familyTree dalej. To jest koncepcja polimorfizmu. Pojęcie dziedziczenia jest również badane tutaj, gdzie jedna klasa może być użyta lub jest dalej zdefiniowana przez podklasę.

Mam nadzieję, że to pomaga i wyjaśnia. Opublikuję wyniki, gdy znajdę komputer, którego mogę użyć do zweryfikowania kodu. Dzięki za cierpliwość!

Midimistro
źródło
2
zauważ, że każde dziecko nie jest rodzicem, więc ta struktura jest zła. Najwyższą klasą powinno być Dziecko (jeśli nie zaczynasz od „Osoby”), co zawsze będzie prawdziwe, z wyjątkiem Adama. Możesz ustawić jego parent_id na zero, ponieważ Stwórcy nie można zdefiniować za pomocą żadnej konstrukcji ludzkiego intelektu.
Yehosef,
1

Polimorfizm pozwala tej samej procedurze (funkcji, metodzie) działać na różne typy.

Ponieważ wiele istniejących odpowiedzi łączy podtyp z polimorfizmem, oto trzy sposoby (w tym podtyp) na wdrożenie polimorfizmu.

  • Polimorfizm parametryczny (ogólny) pozwala rutynie na akceptację jednego lub więcej parametrów typu, oprócz parametrów normalnych, i działa na tych typach.
  • Polimorfizm podtypu podtypów pozwala rutynowej reakcji na dowolny podtyp jego parametrów.
  • Polimorfizm ad hoc ogólnie wykorzystuje rutynowe przeładowanie, aby nadać zachowanie polimorficzne, ale może odnosić się również do innych implementacji polimorfizmu.

Zobacz też:

http://wiki.c2.com/?CategoryPolymorphism

https://en.wikipedia.org/wiki/Polymorphism_(computer_science)

Shaun Luttin
źródło
0

W językach zorientowanych obiektowo polimorfizm umożliwia leczenie i obsługę różnych typów danych za pośrednictwem tego samego interfejsu. Rozważmy na przykład dziedziczenie w C ++: klasa B pochodzi od klasy A. Wskaźnik typu A * (wskaźnik do klasy A) może być używany do obsługi zarówno obiektu klasy A ORAZ obiektu klasy B.

Eran Rehavi
źródło
0

Polimorfizm w kategoriach kodowania polega na tym, że Twój obiekt może istnieć jako wiele typów poprzez dziedziczenie itp. Jeśli utworzysz klasę o nazwie „Kształt”, która określa liczbę stron, które ma Twój obiekt, możesz następnie utworzyć nową klasę, która odziedziczy go, na przykład „Kwadrat” „. Kiedy następnie utworzysz instancję „Kwadrat”, możesz rzucić ją z powrotem i do przodu z „Kształtu” na „Kwadrat” zgodnie z wymaganiami.

Brian Scott
źródło
0

Polimorfizm daje możliwość tworzenia jednego modułu wywołującego inny, a jednocześnie posiadającego punkt zależności czasowej kompilacji od przepływu kontroli zamiast z przepływem kontroli.

Dzięki zastosowaniu polimorfizmu moduł wysokiego poziomu nie zależy od modułu niskiego poziomu. Oba zależą od abstrakcji. Pomaga nam to zastosować zasadę inwersji zależności ( https://en.wikipedia.org/wiki/Dependency_inversion_principle ).

Tutaj znalazłem powyższą definicję. Po około 50 minutach filmu instruktor wyjaśnia powyższe. https://www.youtube.com/watch?v=TMuno5RZNeE

Raghav Navada
źródło
0

Co to jest polimorfizm?

Polimorfizm to zdolność do:

  • Wywołaj operację na instancji typu specjalistycznego, znając tylko jej typ uogólniony, podczas wywoływania metody typu specjalistycznego, a nie metody typu uogólnionego: jest to dynamiczny polimorfizm .

  • Zdefiniuj kilka metod o nazwie zapisu, ale o różnych parametrach: jest to polimorfizm statyczny .

Pierwsza, jeśli historyczna definicja i najważniejsza.

Do czego służy polimorfizm?

Umożliwia tworzenie silnie typowanej spójności hierarchii klas i wykonywanie pewnych magicznych rzeczy, takich jak zarządzanie listami obiektów różnych typów bez znajomości ich typów, ale tylko jednego z ich rodzica, a także powiązań danych.

Mocne i słabe pisanie

Próba

Oto niektóre Kształty, takie jak Punkt, Linia, Prostokąt i Okrąg, których operacja Draw () przyjmuje albo nic, albo parametr, aby ustawić limit czasu, aby go usunąć.

public class Shape
{
 public virtual void Draw()
 {
   DoNothing();
 }
 public virtual void Draw(int timeout)
 {
   DoNothing();
 }
}

public class Point : Shape
{
 int X, Y;
 public override void Draw()
 {
   DrawThePoint();
 }
}

public class Line : Point
{
 int Xend, Yend;
 public override Draw()
 {
   DrawTheLine();
 }
}

public class Rectangle : Line
{
 public override Draw()
 {
   DrawTheRectangle();
 }
}

var shapes = new List<Shape> { new Point(0,0), new Line(0,0,10,10), new rectangle(50,50,100,100) };

foreach ( var shape in shapes )
  shape.Draw();

Tutaj klasa Shape i metody Shape.Draw () powinny być oznaczone jako abstrakcyjne.

Nie mają na celu zrozumienia.

Wyjaśnienie

Bez polimorfizmu, używając abstrakcyjnego wirtualnego przesłonięcia, podczas analizowania kształtów, wywoływana jest tylko metoda Spahe.Draw (), ponieważ CLR nie wie, którą metodę wywołać. Wywołuje więc metodę typu, na której działamy, a tutaj typem jest Shape ze względu na deklarację listy. Więc kod nic nie robi.

Dzięki polimorfizmowi CLR jest w stanie wywnioskować rzeczywisty typ obiektu, na którym działamy, używając tak zwanej wirtualnej tabeli. Więc to nazywa dobroWywołuje metodę, a tutaj wywołanie Shape.Draw (), jeśli Shape is Point wywołuje Point.Draw (). Kod rysuje kształty.

Więcej odczytów

C # - polimorfizm (poziom 1)

Polimorfizm w Javie (poziom 2)

Polimorfizm (przewodnik programowania w języku C #)

Tabela metod wirtualnych

Olivier Rogier
źródło