..
Sommetider du vil oprette en klasse af objekter, der har "denne" funktion, men også "dette" og "det andet", som måske allerede er blevet skrevet andre steder i vores kildekode.
Med andre ord ønsker vi at skabe en klasse, der låner metoder og egenskaber er defineret i andre dele af kildekoden eller på biblioteket.
Omvendt ville vi samles om de samme funktioner vores kildekode på ét sted tilgængeligt for alle. Hvordan?
De purister er forfærdede objektorienteret programmering og support - efter min mening ikke helt uden grund - at enhver brug af denne type kan løses med den rette brug af polymorfi.
Andre, især hvis de kommer fra erfaring med sprog som C + +, hævder, at netop på grund af disse krav ved hjælp af flere arv.
Pragmatiske sprog som Ruby, dog behandle spørgsmålet ved at give en teknik kaldet "mixin", navnet - det lyder! - En is mand gav hende Massuchussets sammensat af forskellige istyper (fløde, chokolade ...)
The Ruby mixins
Teknisk set er Ruby mixins implementeres ved hjælp inden for klasser, kode defineret i forskellige moduler (modul).
For at tage et trivielt eksempel, hvis jeg ønskede at gennemføre et tekstbehandlingsprogram, der automatisk udskrive min venlighed af en virksomhed brev. Da du ønsker at indtaste kun de nødvendige data, dvs modtageren og budskabet. Programmet vil tænke de forskellige venlige lignende, "Sir" og "Med venlig hilsen."
Lad os starte med at definere i en venlig form:
modul CordialitaLettera
def start (adresse)
return "Dear Mr.." + modtager + "\ n"
ende
endelige underskrift (brev)
tilbage bogstav + "\ n" + "Med venlig hilsen, \ nCarlo Smith"
ende
ende
Intet i særdeleshed, da kun to metoder, der kan ændre den tekst, der modtages som input.
Lad os skrive en klasse "blandet" til disse metoder, kun en mixin:
Klasse Breve
omfatter CordialitaLettera
endelige stampaLettera (modtager, besked)
= Startpunktet (modtager)
= Bogstav + indlæg
sætter underskrift (brev)
ende
ende
Breve over klassen har en metode, der tager som input kun de variable dele af brevet, med venlig format, der er defineret i modulet.
Som du kan se syntaksen er meget lig arv i Ruby, men i modsætning til sidstnævnte, kan i en klasse gennemføre et vilkårligt antal af formularer - og som er kendt, kan en klasse være afledt af en og kun én forælder klasse (Ruby understøtter ikke multipel arv!)
For eksempel kan vi skrive:
def main ()
Lengin = Lettere.new
lEngine.stampaLettera ('Alessio Saltarini',
"Jeg bare fortsatte med at overføre
du har bedt om. ')
sætter
lEngine.stampaLettera ('Matthew Pisconi',
"Jeg sender faxen til nr.038283873. ')
ende
som returnerer:
Kære sig.Alessio Saltarini, Jeg har lige gjort overførslen du anmodede om. Med venlig hilsen Carlo Rossi
Kære sig.Matteo Pisconi, Jeg sender faxen til nr.038283873. Med venlig hilsen Carlo RossiDenne teknik, blandt andet giver os mulighed for at assimilere brugen af mixins, der af interfaces i Java: i virkeligheden, hvis en klasse er "blande" med en form i virkeligheden vil gennemføre de metoder (og dermed opfylder et bestemt interface) .
| |
Ruby og Ruby on Rails (Kursus)
Opret software og web-applikationer med Ruby og RoR. Fra 39 €. |