Kas yra polimorfizmas, kaip jis naudojamas ir kaip jis naudojamas?

Stebėjau „ Google Tech“ pokalbių vaizdo įrašą ir jie dažnai nurodė polimorfizmą.

Kas yra polimorfizmas, kaip jis naudojamas ir kaip jis naudojamas?

465
23 июня '09 в 11:14 2009-06-23 11:14 UnkwnTech yra nustatytas birželio 23 d ., 09:14, 2009-06-23 11:14
@ 28 atsakymai

Jei manote apie šio termino graikų šaknis, tai turėtų būti akivaizdi.

  • Poly = daug: daugiakampis = daugialypis, polistirenas = daug stirenų (a) poliglotas = daugelis kalbų ir tt
  • Morph = pokytis ar forma: morfologija = biologinės formos tyrimas, Morpheus = graikų dievų svajonė gali imtis bet kokios formos.

Taigi, polimorfizmas - tai gebėjimas (programuojant) atstovauti tą pačią sąsają skirtingoms pagrindinėms formoms (duomenų tipams).

Pavyzdžiui, daugelyje kalbų sveikieji skaičiai ir plūdės yra netiesiogiai polimorfiniai, nes galite pridėti, atimti, dauginti ir tt, neatsižvelgiant į tai, ar tipai yra skirtingi. Jie retai laikomi daiktais įprastomis sąlygomis.

Tačiau taip pat, pavyzdžiui, „ BigDecimal arba „ Rational arba „ Imaginary klasė gali teikti šias operacijas, net jei jos dirba su įvairių tipų duomenimis.

Klasikinis pavyzdys yra „ Shape klasė ir visos klasės, kurios gali ją paveldėti (kvadratas, apskritimas, dodekadedras, nereguliarus daugiakampis, špatas ir tt).

Polimorfizmo atveju kiekviena iš šių klasių turės skirtingus pagrindinius duomenis. Taško formai reikalingos tik dvi koordinatės (darant prielaidą, kad jis yra dvimatėje erdvėje, žinoma). Ratui reikia centro ir spindulio. Kvadratui arba stačiakampiui reikalingos dvi viršutinio kairiojo ir apatinio dešiniojo kampo koordinatės ir (galbūt) sukimas. Nereguliariam daugiakampiui reikia eilių eilučių.

Pateikdami klasę, atsakingą už savo kodą, ir jo duomenis, galite pasiekti polimorfizmą. Šiame pavyzdyje kiekviena klasė turės savo „ Draw() funkciją, o kliento kodas gali tiesiog:

 shape.Draw() 

gauti bet kokios formos teisingą elgesį.

Tai skiriasi nuo senų būdų, kaip padaryti, kad kodas būtų atskirtas nuo duomenų, ir jūs turėtumėte tokias funkcijas kaip drawSquare() ir drawCircle() .

Objektų orientacija, polimorfizmas ir paveldėjimas yra glaudžiai susijusios sąvokos, ir jos yra svarbios supratimui. Per savo ilgą karjerą buvo daug sidabro kulkų, kurios iš esmės yra visiškai išnaudotos, tačiau OO paradigma pasirodė esanti gera. Sužinokite, suprasti, mylėkite - jums bus malonu, kad: -)


(a) Aš iš pradžių parašiau jį kaip pokštą, bet paaiškėjo, kad tai teisinga ir todėl ne taip smagu. Mohomomirenolis yra gaunamas iš anglies ir vandenilio, C8H8 ir polistirenas gaminamas iš grupių (C 8 H 8 ) n C8H8 (C 8 H 8 ) n .

Galbūt turėčiau pasakyti, kad polipas buvo daugiau p raidžių, nors dabar, kai turėjau paaiškinti šį pokštą, net tai neatrodo juokinga.

Kartais tiesiog reikia palikti, kai esate už: -)

469
23 июня '09 в 11:44 2009-06-23 11:44 atsakymas pateikiamas paxdiablo birželio 23 d., 09:44 , 2009-06-23 11:44

Polimorfizmas yra tas, kai jūs galite peržiūrėti objektą kaip universalią kažko versiją, tačiau, kai ją pasiekiate, kodas nustato, kuris iš jų yra, ir skambina susijusiam kodui.

Čia yra C # pavyzdys. Sukurkite keturias klases konsolės programoje:

 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; } } 

Dabar pagrindiniame () modulyje sukurkite šiuos veiksmus:

 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)); } } 

Šiame pavyzdyje sukuriame bazinės transporto priemonės klasės sąrašą, kuris nežino, kiek ratų yra kiekvienas jo poklasis, tačiau žino, kad kiekvienas poklasis yra atsakingas už tai, kad žinotų, kiek ratų jis turi.

Tada į sąrašą įtraukite dviratį, automobilį ir sunkvežimį.

Tuomet mes galime pereiti prie kiekvienos sąrašo esančios transporto priemonės ir elgtis su jomis vienodai, tačiau, kai kalbame apie kiekvieną transporto priemonės tipą, transporto priemonės klasė perduoda šio kodo vykdymą atitinkamam poklasiui.

Šis kodas vadinamas polimorfiniu, nes tikslus vykdomas kodas nustatomas pagal pokalbio metu nurodytą poklasį.

Tikiuosi, kad tai padės jums.

209
24 июня '10 в 16:25 2010-06-24 16:25 atsakymą davė Antony Gibbsas birželio 24 d., 10:25, 2010-06-24 16:25

Suprasti ir taikyti polimorfizmą PHP , dėka Steve Ruidti.

Polimorfizmas yra ilgas žodis labai paprastai koncepcijai.

Polimorfizmas apibūdina objektą orientuoto programavimo modelį, kuriame klasės turi skirtingą funkcionalumą, kai dalijamasi bendra sąsaja.

Polimorfizmo grožis yra tas, kad kodas, kuris dirba su skirtingomis klasėmis, neturi žinoti, kokią klasę jis naudoja, nes visi jie naudojami taip pat. Analogiškas realaus pasaulio polimorfizmui yra mygtukas. Kiekvienas žino, kaip naudoti šį mygtuką: tiesiog spustelėkite jį. Tačiau mygtukas „veikia“ priklauso nuo to, su kuo jis susijęs, ir nuo konteksto, kuriame jis naudojamas, tačiau rezultatas neturi įtakos jo naudojimui. Jei jūsų viršininkas nurodo paspausti mygtuką, jau turite visą informaciją, kurios reikia norint atlikti užduotį.

Programavimo pasaulyje polimorfizmas naudojamas, kad programos taptų labiau modulinės ir išplėstos. Vietoj klaidingų sąlyginių pareiškimų, apibūdinančių įvairius veiksmus, sukuriate keičiamus objektus, kuriuos pasirenkate pagal savo poreikius. Tai yra pagrindinis polimorfizmo tikslas.

179
04 нояб. atsakymą pateikė Ajay Patel 04.11. 2011-11-04 08:17 '11 at 8:17 2011-11-04 08:17

Jei kas nors jums pasakys CUT šiems žmonėms

  • Chirurgas
  • Plaukų stilius
  • Aktorius

Kas atsitiks?

  • Chirurgas pradės pjūvį.
  • Kirpėjas pradės kirpti plaukus.
  • Aktorius staiga nustos veikti nuo dabartinės scenos, laukdamas direktyvos gairių.

Taigi, pirmiau pateiktas pristatymas rodo, kad OOP yra polimorfizmas (tas pats pavadinimas, skirtingas elgesys).

Jei einate į pokalbį ir apklausėjas prašys pasakyti / parodyti gyvą polimorfizmo pavyzdį tame pačiame kambaryje, mes sėdime, sakykime:

Atsakymas - durys / >

Įdomu, kaip?

Per duris / >

Norėdami tai geriau ir lengviau suprasti, naudoju aukščiau pateiktą pavyzdį. Jei jums reikia kodo nuorodos, vadovaukitės aukščiau pateiktais atsakymais.

47
15 нояб. Atsakymas duotas Sanchit lapkričio 15 d. 2014-11-15 14:48 '14, 14:48 2014-11-15 14:48

Polimorfizmas:

Tai yra objektinio programavimo koncepcija. Įvairių objektų gebėjimas atsakyti kiekvienam savo keliu į identiškus pranešimus vadinamas polimorfizmu.

Polimorfizmas kyla dėl to, kad kiekviena klasė gyvena savo vardų erdvėje. Klasės apibrėžime priskirti pavadinimai neprieštarauja už jos ribų priskirtiems vardams. Tai taikytina, pavyzdžiui, objekto duomenų struktūros kintamiesiems, taip pat objektų metodams:

  • Kaip ir C struktūros laukai yra saugomoje vardų erdvėje, jie yra objekto egzemplioriai.

  • Taip pat saugomi metodo pavadinimai. Skirtingai nuo C funkcijų pavadinimų, metodų pavadinimai yra pasauliniai simboliai. Vienos klasės metodo pavadinimas negali prieštarauti kitų klasių metodų pavadinimams; dvi skirtingos klasės gali įgyvendinti vienodai vadinamus metodus.

Metodų pavadinimai yra objekto sąsajos dalis. Kai pranešimas siunčiamas su prašymu, kad objektas kažką atliktų, pranešimas vadina metodą, kurį turi atlikti objektas. Kadangi skirtingiems objektams gali būti naudojami tokie patys pavadinimai, pranešimo reikšmė turėtų būti suprantama atsižvelgiant į konkretų objektą, kuris gauna pranešimą. Tas pats pranešimas, išsiųstas į du skirtingus objektus, gali skambinti dviem skirtingais būdais.

Pagrindinis polimorfizmo privalumas yra tai, kad jis supaprastina programavimo sąsają. Tai leidžia nustatyti konvencijas, kurios gali būti pakartotinai naudojamos klasėje po klasės. Vietoj to, kad būtų sukurtas naujas pavadinimas kiekvienai naujai funkcijai, kurią pridedate prie programos, tie patys pavadinimai gali būti pakartotinai naudojami. Programavimo sąsaja gali būti apibūdinama kaip abstrakčių elgesio rinkinys, nekalbant apie jas įgyvendinančias klases.

<strong> Pavyzdžiai:

1 pavyzdys: Čia yra paprastas pavyzdys, parašytas „ 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() 

2 pavyzdys: polimorfizmas įgyvendinamas „ Java“ naudojant perkrovos metodą ir perreguliavimo metodą. p>

Apsvarstykite automobilio pavyzdį diskusijai apie polimorfizmą. Imtis bet kokio prekės ženklo, pvz., „Ford“, „Honda“, „Toyota“, „BMW“, „Benz“ ir kt.

Tačiau kiekvienas turi savo pažangias funkcijas ir pažangesnes technologijas, susijusias su jų judėjimu.

Dabar sukurkite pagrindinį automobilio tipą

Car.java

 public class Car { int price; String name; String color; public void move(){ System.out.println("Basic Car move"); } } 

Čia yra „Ford“ automobilio pavyzdys.

„Ford“ praplečia automobilio tipą, kad paveldėtų visus jo elementus (savybes ir metodus).

Ford.java

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

Pirmiau minėta „Ford“ klasė praplečia automobilio klasę ir taip pat įgyvendina perkėlimo () metodą. Nors perkėlimo metodas jau yra prieinamas „Ford“ per paveldėjimą, „Ford“ vis dar įgyvendino šį metodą. Tai vadinama svarbiausiu metodu.

Honda.java

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

Kaip ir „Ford“, „Honda“ taip pat plečia automobilio tipą ir savo nuožiūra taiko perkėlimo metodą.

Metodo apibrėžimas yra svarbus bruožas, leidžiantis polimorfizmą. Naudojant svarbiausią metodą, pogrupiai gali pakeisti metodus, kuriais galima naudotis per paveldėjimą.

PolimorfizmasPavyzdys.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(); } } 

Polimorfizmo produkcijos rezultatas:

Pagrindiniame klasės metode „PolymorphismExample“ sukūriau tris objektus: automobilį, „Ford“ ir „Honda“. Visi trys objektai priklauso automobilio tipui.

Atkreipkite dėmesį į svarbų dalyką, kad superklasės tipas gali būti susijęs su subklasės objekto tipu, bet atvirkščiai. Taip yra todėl, kad visi superklasės nariai yra prieinami poklasiui, naudodami paveldėjimą, ir kompiliatoriaus metu kompiliatorius bando įvertinti, ar referencinis tipas naudoja metodą, kuriuo jis bando pasiekti.

Taigi, polimorfizmo pavyzdžio pavyzdyje esančių automobilių, f ir h nuorodų atveju perkėlimo metodas yra iš automobilio tipo. Taigi kompiliatorius perduoda kompiliavimo procesą be jokių problemų.

Bet kai kalbama apie vykdymo laiko vykdymą, virtuali mašina pradeda taikyti metodus, skirtus objektams, kurie yra potipiai. Taigi, perkėlimo () metodas yra vadinamas iš jų atitinkamų realizacijų.

Taigi, visi objektai yra „Car“ tipo, tačiau vykdymo metu vykdymas priklauso nuo objekto, kuriame vyksta skambutis. Tai vadinama polimorfizmu.

20
05 февр. Atsakyti į Tony Stark 05 vas 2013-02-05 16:41 '13, 16:41 pm 2013-02-05 16:41

Polimorfizmas yra gebėjimas apdoroti objekto klasę taip, lyg ji būtų patronuojanti klasė.

Pavyzdžiui, tarkime, kad yra klasė, vadinama „Gyvūnų“ ir „Klasės šuo“, kuris paveldėjo iš Gyvūnų. Polimorfizmas yra gebėjimas gydyti bet kokį šunų objektą kaip tokį gyvūno objektą:

 Dog* dog = new Dog; Animal* animal = dog; 
19
23 июня '09 в 11:20 2009-06-23 11:20 atsakymą pateikė Tom Dalling , birželio 23 d., 09:20, 2009-06-23 11:20

Paprastas paaiškinimas pagal analogiją

JAV prezidentas naudoja polimorfizmą. Kaip? Na, jis turi daug patarėjų:

  1. Kariniai patarėjai
  2. Teisiniai patarėjai
  3. Branduolinė fizika (kaip patarėjai)
  4. Medicinos konsultantai
  5. ir pan

Kiekvienas turėtų būti atsakingas tik už vieną: pavyzdys:

Prezidentas nėra cinko dangos ar kvantinės fizikos ekspertas. Jis nežino daug dalykų, bet žino tik vieną dalyką: kaip valdyti šalį.

Tai panaši į kodą: problemos ir atsakomybė turėtų būti suskirstytos į atitinkamas klases / žmones. Priešingu atveju turėsite prezidentą, kuris pažodžiui žino viską pasaulyje - visą Vikipediją. Įsivaizduokite, kad jūs turite visą Wikipediją savo kodo klasėje: tai bus košmaras išlaikyti.

Kodėl ši bloga idėja prezidentui žinoti visus šiuos konkrečius dalykus?

Jei pirmininkas konkrečiai papasakojo žmonėms, ką daryti, tai reikštų, kad prezidentas turi tiksliai žinoti, ką daryti. Jei prezidentas pats turi žinoti konkrečius dalykus, tai reiškia, kad, kai reikia atlikti pakeitimus, turite tai padaryti dviejose vietose, ne vienoje vietoje.

Pavyzdžiui, jei EPS pakeičia taršos įstatymus, tada, kai tai atsitiks: turėsite keisti EPA klasę ir prezidento klasę. Kodo keitimas dviejose vietose, o ne vienoje vietoje, gali būti pavojingas, nes jį daug sunkiau prižiūrėti.

Ar yra geresnis požiūris?

Yra tinkamesnis požiūris: prezidentui nereikia žinoti visų dalykų specifikų - jis gali pareikalauti geriausių patarimų iš konkrečiai paskirtiems žmonėms.

Jis gali naudoti polimorfinį požiūrį į šalies valdymą.

Pavyzdžiui, polimorfinio metodo naudojimas:

Viskas, ką prezidentas daro, prašo žmonių patarti jam - ir ką jis iš tikrųjų daro realiame gyvenime - ir ką geras prezidentas turėtų daryti. visi jo patarėjai reaguoja skirtingai, tačiau jie visi žino, ką reiškia prezidentas: Patarti (). Jis susirinko šimtus žmonių į savo biurą. Tiesą sakant, nesvarbu, kas jie yra. Viskas, ką pirmininkas žino, yra tai, kad kai jie prašo „pasikonsultuoti“, jie žino, kaip tinkamai reaguoti :

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

Šis metodas leidžia prezidentui pažodžiui valdyti šalį, nieko nežinodamas apie karinę medžiagą, visuomenės sveikatą ar tarptautinę diplomatiją: duomenis palieka ekspertai. Vienintelis dalykas, kurį prezidentas turėtų žinoti, yra toks: „Patarti ()“.

Ką nenorite:

 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(); } } 

NE! NE! NE! Pirmiau minėtame scenarijuje prezidentas atlieka visą darbą: jis žino apie karių skaičiaus didėjimą ir esamas sąlygas. Tai reiškia, kad jei pasikeis Artimųjų Rytų politika, prezidentas turės pakeisti savo komandas, taip pat Petraeus klasę. Mums reikia tik pakeisti Petraeus klasę, nes prezidentas neturi būti susietas su tokiomis detalėmis. Jis neturi žinoti detalių. Viskas, ką jis turi žinoti, yra tai, kad jei jis padarys vieną užsakymą, viskas bus pasirūpinta. Visa informacija turi būti pateikta ekspertams.

Tai leidžia prezidentui daryti viską, ką jis daro geriausiai: sukurti bendrą politiką, atrodyti gerai ir žaisti golfą: P.

Kaip ji įgyvendinama - per bazinę klasę arba bendrą sąsają

Tiesą sakant, tai yra polimorfizmas. Kaip tiksliai tai daroma? „Įdiegti bendrą sąsają“ arba naudoti bazinę klasę (paveldėjimą) - žr. Aukščiau pateiktus atsakymus, kurie tai išsamiau apibūdina. (Norėdami aiškiau suprasti šią sąvoką, jums reikia žinoti, kas yra sąsaja, ir jūs turite suprasti, kas yra paveldėjimas. Be jo galite kovoti.)

Kitaip tariant, „Petraeus“, „Condi“ ir „HealthOfficials“ būtų klasės, kurios „įdiegtų sąsają“ - leiskite man „ IAdvisor sąsajai, kurioje yra tik vienas būdas: Advise() . Bet dabar įžengiame į specifiką.

Tai būtų tobula

  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 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); } } 

Santrauka

Viskas, ką jums reikia žinoti, yra:

  • Prezidentui nereikia žinoti specifikos - jie paliekami kitiems.
  • Viskas, ką prezidentas turi žinoti, yra paklausti, kas kada nors eina į duris, kad patartų jam, ir mes žinome, kad jie tikrai žinos, ką daryti, kai prašo jo duoti patarimų (nes visi jie tikrai yra patarėjai (arba IAdvisors :))

Tikiuosi, kad tai padės jums. Jei nieko nesuprantate, rašykite komentarą ir bandysiu dar kartą.

17
29 окт. atsakymas pateikiamas BKSpurgeon 29 okt. 2016-10-29 03:17 '16 at 3:17 2016-10-29 03:17

Tai paprastai reiškia A tipo objekto gebėjimą elgtis kaip B tipo objektas. Objektinio programavimo atveju tai paprastai pasiekiama paveldėjimo būdu. Kai kurios Wikipedia nuorodos skaitymui:

EDIT: fiksuotos skaldytos nuorodos.

8
23 июня '09 в 11:18 2009-06-23 11:18 atsakymą pateikė JesperE birželio 23 d. , 09:18 , 2009-06-23 11:18

Polimorfizmas yra:

 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 } 

Taurę galite perduoti tik vietoj konkretaus atvejo. Tai padeda bendrai, nes jums nereikia pateikti konkrečios priemonės () kiekvienos rūšies puodelio atveju.

7
24 июня '10 в 16:07 2010-06-24 16:07 atsakymą pateikė Vinko Vrsalovic birželio 10 d., 16:07, 2010-06-24 16:07

(Ieškojau kito straipsnio apie kažką visiškai kitokio ... ir atsirado polimorfizmas ... Dabar aš maniau, kad žinojau, kas yra polimorfizmas ... bet, matyt, tai nėra taip gražiai paaiškinta. bet kuriuo atveju geriau jį bendrinti ...)

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

skaityti šioje dalyje:

..... polimorfizmas. Tai yra sumanus būdas pasakyti, kad skirtingi daiktavardžiai jiems gali turėti tą patį veiksmažodį.

6
14 янв. Atsakymą pateikė Kcats Wolfrevo sausio 14 d. 2014-01-14 13:59 '14, 13:59, 2014-01-14 13:59

Žinau, kad tai yra senesnis klausimas, turintis daug gerų atsakymų, bet norėčiau pateikti atsakymą į vieną sakinį:

Išvestinio tipo tvarkymas, lyg jis būtų bazinis tipas.

Yra daug aukščiau pateiktų pavyzdžių, kurie rodo, kad tai veikia, bet manau, kad tai geras trumpas atsakymas.

6
18 окт. Abe Miessler atsakymas spalio 18 d '12 в 0:18 2012-10-18 00:18