..


Sponsorētās saites

Polimorfisms un pīļu Rakstīt Ruby

Pants raksta Alessio Saltarini
Lapa 1 no 2

Polimorfisms ir plānošanas metode, kas ļauj izmantot daļas avota kodu, kas, vienlaikus paliekot nemainīga, ģenerēt izpildes laika uzvedību.

Izveidot polimorfs kods ir īpaša nozīme objektorientētā programmēšana: nozīmē radīt taksonomija klases, kas visu īstenot tādu pašu interfeisu.

Tātad, ja, piemēram, mana interfeiss definē metodi "getArea", katra klase, kas īstenos šo saskarni būs metodi "getArea": ​​tas ļauj mums rakstīt polimorfs metodes, metodes, kas var mainīt savu algoritmu izpildi Atkarībā no veida objektu, kas tiek nodots kā arguments.

Polimorfisms tradicionālās OOP valodās

Java - bet tas pats attiecas uz C + +, un jebkurā citā valodā, Object Oriented (OO), kas pabeigti, tad mēs redzēsim, nevis gadījumā, Ruby - piemērs:






 interfeiss IFormaGeometrica







 {



   



 getArea spēkā neesošu ();







 }









 valsts klases Triangle īsteno IFormaGeometrica







 {



 



 @ Override



 



 valsts int getArea ()



 



 {



  



 atgriešanās (* this.base this.altezza) / 2;



 



 }







 }



Šajā gadījumā mēs, definē saskarni IFormaGeometrica kas nosaka, ka katrs objekts, kas "ir" FormaGeometrica getArea būs metodi - piemēram, klases Triangle, kas ir FormaGeometrica, ir savs īstenot getArea, kas ļauj mums rakstīt programmu spēj aprēķināt jomas jebkuras ģeometriskas formas, vai šī ir klāt šodien kodu un kas tiks īstenoti nākotnē, nemainot sākotnējo pirmkodu.

Patiesībā, ja es rakstītu klasi Kalkulators:






 valsts galīgo kategoriju Kalkulators







 {





 



 valsts statisko spēku galvenās (String [] args)



 



 {



  



 Vākšanas veidlapas <IFormaGeometrica> =



          



 <IFormaGeometrica> Jauns ArrayList ();





  



 forme.add (jauns Triangle ());



  



 forme.add (jauns Square ());



  



 forme.add (jauns Pentagon ());





  



 par (g IFormaGeometrica: formas)



  



 {



   



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



  



 }



 



 }







 }



Tas var aizņemt kā priekšnodokli jebkura vākšanas ģeometriskās formas, ar nosacījumu, ka katra kolekcija IFormaGeometrica objekts īsteno saskarni, un ka ir būtiski metodi getArea. Šis piemērs Java ir tīri akadēmisks: patiesībā, iespējams, konstruktors katras klases, mēs arī ieguldījumu pasākumi un ģeometriskas formas malām, apothem, un tā tālāk.

Mērķis ir sasniegts: mēs wrote klases, kas var drukāt ekrāna laukums jebkuram ģeometriskas formas. Es atkārtoju: tas ir kods, kas jau ir īstenota (kā gadījumā Triangle), vai tas ir jāievieš nākotnē.

Ne tikai to, ka tad, ja Triangle zonā aprēķina īstenošanu, kas bug, es varu mainīt Triangle klasi bez pārrakstīt klases Kalkulators. Varbūt tas bija izvietots uz servera, kas nepieciešams, lai atsāktu jebkādas izmaiņas: šajā gadījumā nav jāmaina kods ir liela priekšrocība. Bet citi nav, tas vienmēr ir izdevīgi, lai ierobežotu daļu koda, ka "pārmaiņas", jo visas izmaiņas līdz ar to potenciālo bugs. Un otrādi, tā ir laba plānošanas prakses, lai vienmēr zinātu ar noteiktību, kas daļu no koda, kas paliek nemainīgs.

Kas notiek "aiz ainas" ir tas, ka kompilators nodrošina, ka katrs iekšpusē polimorfiskais kodu objekta galvenā metode klases Kalkulators izpilda interfeisu. Tādā veidā, tas ir teicis, ir izteiksme, izmantojot metodoloģiju, dizaina ar līgumu, "līgums tiek ievērota."

Ja nē, ja tas ir "formas" ir objekts klasē, ka mēs nebūtu jāīsteno IFormaGeometrica kļūdu kompilēšanas laikā, vai nav izdevies palaist programmas, jo kompilators varētu paziņojums kļūda.

Polimorfisms Ruby

Bet, kas notiek Ruby? Un "iespējams Ruby, kas nav apkopota, bet interpretē valodas, rakstīšanu polimorfs metodes?

Jā, noteikti ir iespējams, bet ir milzīga starpība "filozofiski" nekā OO valodās un apkopoti, kas

mēs varētu aprakstīt. In OO programmēšanas Java un klasika, lai noteiktu, ka objekts pieder konkrēta veida objektus (piemēram, īsteno noteiktu interfeisu) ir skaidri izriet objektu no mātes klases: Pamatā jums ir nepieciešams izmantot metodes mantojuma (mantojumu ar klases, abstraktas klases vai interfeisa).

Tas būtu tāpat kā sakot: Lai noteiktu, vai tā ir pīle man priekšā, es viņa DNS, un pētījumu laboratorijā, lai noskaidrotu, vai tas ir pīle.

Ruby jūs izmantojat "pīle tests" (pīļu tests) izgudroja James Riley (sk. http://en.wikipedia.org/wiki/Duck_typing ):

ja tas iet kā pīle un quacks kā pīle, tad tas ir pīle.

(Kas, starp citu, ir tas, kas padara katru no mums, kad viņš redz pīles).

Ko tas nozīmē? Tas nozīmē, ka Ruby, un vispārīgāk objektorientētā skriptu valodās, kā arī Python un Perl, nav nepieciešams norādīt interfeisu, ne arī skaidras mantojuma attiecības starp klasēm.

Vienkārši tulks "cer," ka programmētājs ja metode soļus polimorfas iebilst, ka "ir jābūt" noteiktā veidā, mums patiesībā ir.

Šajā pašā kategorijā ...
E-Learning
Ruby un Ruby On Rails (Course) Ruby un Ruby On Rails (Course)
Izveide programmatūras un Web lietojumprogrammas ar Ruby un ROR. Sākot no € 39.
Sponsorētās saites