..
Den polymorfi er et programmeringssprog teknik, som tillader brug af dele af kildekoden, mens forbliver uændrede, til at generere run-time adfærd.
Oprettelse af polymorfe kode har en særlig betydning i det objekt-orienteret programmering: det betyder at skabe en taksonomi af alle klasser, der implementerer et interface.
Så hvis for eksempel definerer min interfacet en metode "getAreal", hver klasse, som vil gennemføre dette interface vil have en metode "getAreal": dette giver os mulighed for at skrive polymorfe metoder, metoder, der kan ændre deres algoritme udførelse Afhængigt af hvilken type objekt, der er gået som et argument.
Polymorfi i den traditionelle OOP sprog
I Java - men det samme gælder for C + + og andre sprog, Objektorienteret (OO) afsluttet, vil vi derefter hånd tilfælde af Ruby - for eksempel:
grænseflade IFormaGeometrica
{
void getAreal ();
}
public class Triangle implementerer IFormaGeometrica
{
@ Override
public int getAreal ()
{
return (* this.base this.altezza) / 2;
}
}
I dette tilfælde definerer vi det interface IFormaGeometrica hvori det hedder, at hvert objekt, der "er" en FormaGeometrica getAreal vil have en metode - såsom Triangle klasse, som er en FormaGeometrica, har sin egen gennemførelse af getAreal, hvilket giver os mulighed for at skrive et program i stand til at beregne arealet af enhver geometrisk form, om dette er nu til stede i koden, og som vil blive gennemført i fremtiden, uden at ændre den oprindelige kildekode.
Faktisk, hvis jeg skriver en klasse Calculator:
offentlige endelige klasse Calculator
{
public static void main (String [] args)
{
Indsamling former <IFormaGeometrica> =
<IFormaGeometrica> Ny ArrayList ();
forme.add (ny Triangle ());
forme.add (ny Square ());
forme.add (ny Pentagon ());
for (IFormaGeometrica g: form)
{
System.out.println (g.calcolaArea ());
}
}
}
Dette kan tage som input enhver samling af geometriske former, forudsat at hvert objekt i samlingen skal implementere grænsefladen IFormaGeometrica, og det har hovedsageligt en metode getAreal.
Dette eksempel i Java er rent akademisk: i virkeligheden, i constructoren for hver klasse nok, vil vi også inddrage input foranstaltninger af sider af den geometriske form, den skrå, og så videre.
Målet er nået: skrev vi en klasse, der kan udskrive til video-området for eventuelle geometrisk form. Jeg gentager: Dette er den kode, der allerede er gennemført (som det er tilfældet i trekant), som er ved at blive implementeret i fremtiden.
Ikke kun: hvis gennemførelsen af beregningen af den Trekant-området indeholdt en fejl, kan jeg ændre den klasse, uden at skulle omskrive klassen Trekant Calculator. Måske var det indsat på en server, der skal genstarte hver ændring: i dette tilfælde ikke behøver at ændre koden er en stor fordel. Men ud over det, er det altid en fordel at begrænse de dele af kode, "forandring", fordi hver ændring medfører det potentielle fejl. Omvendt er det en god programmering praksis altid at vide med sikkerhed, hvilke dele af koden, der forbliver uændrede.
Hvad sker der "bag kulisserne" er, at compileren sørger for, at hver eneste objekt i polymorfe kode den vigtigste metode i klassen Lommeregner implementerer grænsefladen. På denne måde, siger, at de er et udtryk ved hjælp af den metode til design af en kontrakt, "kontrakten er overholdt."
Hvis ikke, hvis det er i "former" har et objekt af en klasse, at vi ikke ville gennemføre IFormaGeometrica en fejl under kompileringen, eller ikke formår at køre programmet, fordi compileren ville mærke til fejl.
Den polymorfi i Ruby
Men hvad sker der i Ruby? Og 'muligt i Ruby, hvilket ikke er kompileret, men fortolket sprog, skrivning polymorfe metoder?
Ja, det er bestemt muligt, men der er en stor forskel "filosofisk" end OO sprog og kompileret, som
vi kunne beskrive det. OO programmering i Java og klassisk, at fastslå, at et objekt tilhører en bestemt type objekter (som implementerer en bestemt interface) skal udtrykkeligt objekt at stamme fra en forælder klasse: dybest set, du har brug for at bruge de teknikker arv (arve af en klasse, en abstrakt klasse eller et interface).
Det ville være ligesom at sige: at afgøre, om dette er en and foran mig, jeg tager hans DNA og studerer i laboratoriet for at se, om det er til ænder.
I Ruby du bruger "duck test" (duck test) blev opfundet af James Riley (se http://en.wikipedia.org/wiki/Duck_typing ):
hvis det går som en and og kvaksalvere som en and, så er det en and.
(Hvilket i øvrigt er hvad der gør hver enkelt af os, når han ser en and).
Hvad betyder det? Det betyder, at i Ruby, og mere generelt i objekt-orienterede scriptsprog, samt Python og Perl, ingen grund til at specificere den grænseflade, hverken udtrykkelige arv relationer mellem klasser.
Tolken blot "tillid", at programmøren, den metode, der trin, når en polymorf objekt, der "skulle have" en bestemt måde, vi faktisk har.
| |
Ruby og Ruby on Rails (Kursus)
Opret software og web-applikationer med Ruby og RoR. Fra 39 €. |