..
Der Polymorphismus ist eine Programmiertechnik, dass die Verwendung von Teilen des Quellcodes ermöglicht, während unverändert bleiben, um Laufzeitverhalten zu generieren.
Erstellen polymorphen Code hat eine besondere Bedeutung in der objektorientierten Programmierung: Es bedeutet die Schaffung einer Taxonomie aller Klassen, die eine Schnittstelle zu implementieren.
Also, wenn zum Beispiel definiert meine Schnittstelle eine Methode "getArea", jede Klasse, die diese Schnittstelle implementieren wird ein Verfahren "getArea" haben wird: Diese ermöglicht es uns, polymorphe Methoden zu schreiben, Methoden, deren Ausführung von Algorithmen ändern können Je nach Art des Objekts, das als Argument übergeben wird.
Polymorphismus in der traditionellen OOP-Sprachen
In Java - aber das gleiche gilt für C + + und andere Sprachen, Objektorientierte (OO) abgeschlossen ist, werden wir dann von Hand bei Ruby - zum Beispiel:
Schnittstelle IFormaGeometrica
{
void getArea ();
}
public class Dreieck implementiert IFormaGeometrica
{
@ Override
public int getArea ()
{
return (* this.base this.altezza) / 2;
}
}
In diesem Fall definieren wir die Schnittstelle IFormaGeometrica was bedeutet, dass jedes Objekt, das "ist" ein FormaGeometrica getArea wird ein Verfahren haben Staaten - wie die Triangle-Klasse, die eine FormaGeometrica ist, hat seine eigene Umsetzung getArea, die uns ein Programm zu schreiben erlaubt in der Lage, den Bereich der jede geometrische Form zu berechnen, ob das jetzt in den Code und das wird auch in Zukunft umgesetzt werden, ohne Änderung der ursprünglichen Quellcode.
In der Tat, wenn ich eine Klasse schreiben Calculator:
public final class Calculator
{
public static void main (String [] args)
{
Sammlung bildet <IFormaGeometrica> =
<IFormaGeometrica> New ArrayList ();
forme.add (neue Dreieck ());
forme.add (neuen Platz ());
forme.add (neue Pentagon ());
for (IFormaGeometrica g: form)
{
System.out.println (g.calcolaArea ());
}
}
}
Dies kann als Eingabe einer Sammlung von geometrischen Formen, vorausgesetzt, dass jedes Objekt in der Auflistung muss die Schnittstelle IFormaGeometrica umzusetzen, und das hat im Wesentlichen eine Methode getArea.
Dieses Beispiel in Java ist eine rein akademische, im Gegenteil: Wahrscheinlich in den Konstruktor für jede Klasse, wir werden Eingang Maßnahmen der Seiten der geometrischen Form, die schräg sind, und so weiter.
Das Ziel ist erreicht: wir schrieben eine Klasse, die auf Video drucken können im Bereich der jede geometrische Form. Ich wiederhole: Das ist der Code, der bereits umgesetzt wurde (wie im Falle des Dreiecks), die in der Zukunft umgesetzt wird.
Nicht nur: wenn die Umsetzung der Berechnung der Triangle enthielt einen Fehler, kann ich die Klasse, ohne die Klasse Triangle Calculator rewrite ändern. Vielleicht war es auf einem Server, auf jede Änderung einen Neustart braucht eingesetzt: in diesem Fall nicht mit den Code zu ändern ist ein großer Vorteil. Aber anders als das, ist es immer vorteilhaft, die Teile des Codes, der "Wandel" zu begrenzen, weil jede Veränderung mit sich bringt potenzielle Fehler. Umgekehrt ist es ein guter Programmierstil, immer mit Sicherheit, welche Teile des Codes, die unverändert bleiben weiß.
Was passiert, "hinter den Kulissen" ist, dass der Compiler sicher, dass jedes Objekt in der polymorphen Code der main-Methode der Klasse Calculator die Schnittstelle implementiert wird. Auf diese Weise, so sagen sie ist ein Ausdruck mit der Methodik des Design by Contract ", der Vertrag eingehalten wird."
Wenn nicht, haben, wenn dies in "Formen" ein Objekt einer Klasse, die wir nicht umsetzen IFormaGeometrica ein Fehler bei der Kompilierung, oder hat es nicht geschafft, das Programm auszuführen, da der Compiler den Fehler bemerken würde.
Der Polymorphismus in Ruby
Aber was passiert in Ruby? Und 'möglich in Ruby, die nicht kompiliert wird, sondern interpretierte Sprache, Schrift polymorphe Methoden?
Ja, es ist sicherlich möglich, aber es gibt einen großen Unterschied "philosophischen" als OO-Sprachen und zusammengestellt, die
könnten wir es beschreiben. OO-Programmierung in Java und klassisch, um festzustellen, dass ein Objekt auf eine bestimmte Art von Objekten (implementiert eine bestimmte Schnittstelle) müssen ausdrücklich widersprochen aus einer übergeordneten Klasse abgeleitet hingehört: im Grunde müssen Sie die Techniken der Vererbung (Vererbung durch eine Klasse, eine abstrakte Klasse oder eine Schnittstelle).
Es würde man sagen: Um festzustellen, ob dies eine Ente vor mir ist, ich nehme seine DNA und Studium im Labor, um zu sehen, wenn es um Ente ist.
In Ruby sind Sie mit der "Ente-Test" (Ente-Test) von James Riley (siehe erfunden http://en.wikipedia.org/wiki/Duck_typing ):
wenn es wie eine Ente und quakt wie eine Ente, dann ist es eine Ente.
(Das ist übrigens, was jeder von uns, wenn er eine Ente sieht).
Was bedeutet das? Es bedeutet, dass in Ruby, und ganz allgemein in die objektorientierte Skriptsprache, sowie Python und Perl, keine Notwendigkeit, die Schnittstelle angeben, weder ausdrücklich Vererbungsbeziehungen zwischen den Klassen.
Der Dolmetscher einfach "Vertrauen", dass der Programmierer, die Methode, wenn ein polymorphes Objekt, das "haben sollte" eine bestimmte Art und Weise haben wir tatsächlich die Schritte.
| |
Ruby und Ruby on Rails (Kurs)
Neues Software-und Web-Anwendungen mit Ruby und RoR. Von 39 €. |