Co to jest polimorfizm, do czego służy i jak się go stosuje?
Co to jest polimorfizm, do czego służy i jak się go stosuje?
Odpowiedzi:
Jeśli pomyślisz o greckich korzeniach tego terminu, powinno stać się oczywiste.
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 BigDecimal
lub Rational
czy Imaginary
może również świadczyć te operacje, chociaż działają one na różnych typach danych.
Klasycznym przykładem jest Shape
klasa 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, p
chociaż teraz, gdy musiałem wyjaśnić dowcip, nawet to nie wydaje się śmieszne.
Czasami powinieneś po prostu wyjść, gdy jesteś w tyle :-)
Poly = many and Morph = change or form
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.
Class_Excel
, Class_CSV
do której można by ją wywołać lub mieć Reader
klasę o nazwie. Tak czy inaczej, jakiś rodzaj iteracji, jeśli / to / else będzie musiał gdzieś być przechowywany.
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.
Jeśli ktoś powie CUT tym osobom
Co się stanie?
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.
.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.
Prezydent Stanów Zjednoczonych stosuje polimorfizm. W jaki sposób? Cóż, ma wielu doradców:
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.
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 IAdvisor
interfejs, 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);
}
}
Wszystko, co naprawdę musisz wiedzieć, to:
Naprawdę mam nadzieję, że ci to pomoże. Jeśli nic nie rozumiesz, opublikuj komentarz, a ja spróbuję ponownie.
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.
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;
classes have different functionality while sharing a common interface
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.
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.
classes have different functionality while sharing a common interface
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
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ź.
(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.
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.
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 :)
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());
}
AnnHalloway
i VictorBorga
czuję, że powinny być obiektami, a nie klasami - twój przykład lepiej czytałby z np. public class Pianist implements Musician
i victorBorge = new Pianist();
itp.
Przedstawiłem ogólny przegląd polimorfizmu dla innego pytania:
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ścix
iy
dane wejściowe. Aby być polimorficznym,f()
musi być w stanie działać z wartościami co najmniej dwóch różnych typów (np.int
Idouble
), znajdując i wykonując odpowiedni kod.
(ciąg dalszy na Polimorfizm w c ++ )
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:
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.
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 Fraction
i 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 Fraction
i ComplexNumber
obie implementują klasę abstrakcyjną o nazwie, Number
któ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 Number
utworzonego:
$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ą.
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.
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.
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.
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ść!
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.
Zobacz też:
http://wiki.c2.com/?CategoryPolymorphism
https://en.wikipedia.org/wiki/Polymorphism_(computer_science)
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.
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.
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
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.
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.
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.
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.
Polimorfizm w Javie (poziom 2)