..


Rėmėjų nuorodos

Polimorfizmas ir ančių Rašyti Ruby

Straipsnį parašė Alessio Saltarini
Puslapis 1 iš 2

Polimorfizmas yra programavimo technologija, kuri leidžia dalių kodą naudoti, kad nors nesikeis, generuoti run-time elgesį.

Sukurti polimorfinis kodas konkrečią reikšmę objektinio programavimo: reikia sukurti klases, kad visi įgyvendinti tą pačią sąsają taksonomijos.

Taigi, jei, pavyzdžiui, mano sąsaja apibrėžia metodą "getArea", kiekvienai klasei, kad įgyvendins šią sąsają turės metodas "getArea": ​​tai leidžia mums parašyti polimorfinis metodus, metodus, kurie gali pakeisti savo algoritmo vykdymo Priklausomai nuo objekto tipą, kuris yra perduodamas kaip argumentas.

Polimorfizmas tradicinėse OOP kalbų

Java - tačiau tas pats pasakytina ir apie C + + ir kitomis kalbomis Objektinis (OO) baigtas, tada matysime vietoj Ruby atveju - pavyzdžiui:






 sąsaja IFormaGeometrica







 {



   



 getArea negaliojančiu ();







 }









 visuomenės klasė trikampis įgyvendina IFormaGeometrica







 {



 



 @ Valdymas



 



 visuomenės int getArea ()



 



 {



  



 grįžti (* this.base this.altezza) / 2;



 



 }







 }



Šiuo atveju mes apibrėžti sąsają IFormaGeometrica, kuriame teigiama, kad kiekvienas daiktas, kad "yra" FormaGeometrica getArea turės metodas - pavyzdžiui, klasės trikampis, kuris yra FormaGeometrica, turi savo įgyvendinimo getArea, kuri leidžia mums parašyti programą gali apskaičiuoti bet kokios geometrinės formos srityse, ar tai būna šiandien kodas ir kuris bus įgyvendintas ateityje, nekeičiant pirminio kodo.

Iš tiesų, jei aš rašau klasės skaičiuoklė:






 visuomenės galutine klase skaičiuoklė







 {





 



 public static void main (String [] args)



 



 {



  



 Rinkimo formų <IFormaGeometrica> =



          



 <IFormaGeometrica> Naujų ArrayList ();





  



 forme.add (naujas trikampis ());



  



 forme.add (naujas aikštėje ());



  



 forme.add (naujas Pentagono ());





  



 už (g IFormaGeometrica: formos)



  



 {



   



 System.out.println (g.calcolaArea ());



  



 }



 



 }







 }



Tai gali užtrukti kaip įvesties bet geometrinių figūrų kolekcija, su sąlyga, kad kiekvienas surinkimo IFormaGeometrica objektas realizuoja sąsają, ir kad iš esmės metodas getArea. Šis pavyzdys Java yra grynai akademiniai: iš tiesų, turbūt kiekvienos klasės konstruktorius, mes taip pat įvesties priemones iš geometrinės formos pusių, apothem, ir pan.

Tikslas pasiektas: mes rašė, kad klasė gali spausdinti ekraną bet geometrinės formos srityje. Kartoju: tai kodas, kuris jau buvo įgyvendintos (kaip ir trikampio atveju), ar jis būtų įgyvendinamas ir ateityje.

Ne tik, kad jei trikampio plotas skaičiavimo įgyvendinimas yra klaida, galiu keisti trikampis klasės be perrašyti klasės skaičiuoklė. Gal tai buvo dislokuoti serverio, kad reikia iš naujo paleisti bet kokį: šiuo atveju neturi pakeisti kodą yra didelis privalumas. Tačiau, išskyrus, kad ji visada naudinga apriboti kodo dalys, kurios "Keisti", nes kiekvienas pokytis atneša su juo galimybes klaidas. Priešingai, ji yra gera programavimo praktika visada žino, tikrai, kas dalių kodą, kuris išlieka nepakitęs.

Kas atsitinka "užkulisiuose", kad sudarytojas užtikrina, kad kiekvienas viduje polimorfinis kodo objekto pagrindinis metodas klasės skaičiuoklė įgyvendina sąsaja. Tokiu būdu, jis sakė, yra išraiška naudojant projektavimo pagal sutartį metodika ", sutarties laikomasi."

Jei ne, jei tai "formos" yra A klasės objektą, kad mes nebūtų įgyvendinti IFormaGeometrica kompiliavimo metu klaida, ar ne valdyti paleisti programą, nes kompiliatorius bus pranešimas apie klaidą.

Ruby polimorfizmas

Bet kas atsitiks, Ruby? Ir "įmanoma Ruby, kuri nėra sudarytas, tačiau aiškinama kalba, raštu polimorfinis metodai?

Taip, tai tikrai įmanoma, bet yra gilus skirtumas "filosofijos" kaip OO kalbų ir duomenis, kurie

mes galime ją apibūdinti. OO programavimas Java ir klasika, nustatyti, kad objektas priklauso tam tikro tipo objektų (ty įgyvendina tam tikrą sąsaja) reikia aiškiai išvesti objektą iš tėvų klasė: iš esmės jums reikia naudoti paveldėjimo būdų (paveldi iš klasės, abstrakčios klasės arba sąsajos).

Tai būtų, pavyzdžiui, sakydamas: nustatyti, ar tai yra priešais mane antis, aš jo DNR ir tyrimo laboratorijoje pamatyti, jei ji yra antis.

Ruby jūs naudojate "antis testas" (ančių testas) išrado James Riley (žr. http://en.wikipedia.org/wiki/Duck_typing ):

jei ji vaikšto kaip ančių ir šarlatāni kaip antis, tai antis.

(Kuris, beje, ką daro kiekvienas iš mūsų, kai jis mato ančių).

Ką tai reiškia? Tai reiškia, kad Ruby, ir apskritai Objektinis skriptų kalba, taip pat Python, Perl, nereikia nurodyti sąsaja, nei aiškaus paveldėjimo santykius tarp klasių.

Tiesiog vertėjas "tikisi", kad programuotojas, jei metodo veiksmus polimorfinis objektą, kad "turėtų būti" tam tikru būdu, mes iš tikrųjų turime.

Tos pačios kategorijos ...
E-mokymasis
Ruby ir Ruby on Rails (kursai) Ruby ir Ruby on Rails (kursai)
Sukurti programinės įrangos ir interneto programas su Ruby ir RoR. Nuo 39 €.
Rėmėjų nuorodos