Im vorigen Beitrag zu Realaxy Editor haben wir über die Sprache Traits gesprochen, mit der Sie die Mehrfachvererbung nutzen können. Nun wenden wir uns einer weiteren bemerkenswerten Gelegenheit zu: der Überladung des Bedieners.
Der Realaxy ActionScript Editor (RASE) ist hier verfügbar (für Windows, Macintosh OS X und Linux). Hinweis: Wenn es sich um Ihre erste Erfahrung mit dem Editor handelt, lesen Sie bitte das RASE-How-to.
Eine der wichtigsten Funktionen der RASE-Betaversion 10 ist die Unterstützung für die Überladung von Operatoren, sodass Entwickler das Verhalten der Operatoren (*, + usw.) unter verschiedenen Umständen ändern können. Dieses Merkmal ist ebenso wie die Mehrfachvererbung Gegenstand eines heiligen Krieges zwischen leidenschaftlichen Anhängern zweier verschiedener Programmierparadigmen.
Die Vorteile der Überladung von Operatoren liegen auf der Hand:
ABC
als a.Multiply (b) .Multiply (б).
Punkt1 + Punkt2,
aber nicht point1.plus (point2)
.Das eigentliche Argument gegen das Überladen von Operatoren ist der Verlust der Kontrolle über Ihren Code. Manchmal ist unklar, wo ein Bediener überlastet ist und wo nicht. Durch das Hinzufügen eines überladenen Operators werden Änderungen im Verhalten des vorhandenen Codes vorgenommen, die möglicherweise zu unerwarteten Folgen führen.
Das Überladen von Operatoren ist in ActionScript (ECMA3) nicht enthalten, obwohl es für Standard ECMA4 vorgeschlagen wird. Java unterstützt keine Operatorüberladung, aber sowohl Groovy (? Java mit syntaktischem Zucker?) Als auch Scala. Darüber hinaus sind die Operatoren von C # möglicherweise überlastet.
Man kann nicht sagen, ob es eine gute oder eine schlechte Sache ist. Es ist jedoch auch praktisch sichergestellt, dass es manchmal ein virtuelles Muss ist. Wenn zum Beispiel mehrere mathematische Operationen miteinander verkettet werden, wird der Code durch das Überladen von Operatoren wirklich viel prägnanter, wodurch das Verständnis der Funktionsweise verbessert wird. Aber genug Theorie - beziehen wir uns auf die Praxis.
Wir sprechen über eine Spracherweiterung überladeneBediener das wurde in RASE seit Beta 10 (Build 8145+) eingeführt.
Sie können sie (oder eine andere Sprache) einfach in Ihr Projekt importieren, indem Sie auf drücken Strg + L (Cmd + L) im Realaxy Editor.
Apropos, überladeneBedienerin RASE ist nur ein Port der überladeneBediener Sprache von der Jetbrains MPS-Plattform. Wir beschlossen, das Rad nicht neu zu erfinden, und nachdem wir die Zielanwendungsdomäne untersucht hatten, kamen wir zu dem Schluss, dass die Jetbrains-Lösung ausreichend scheint und alle unsere Anforderungen erfüllt. Wir haben einige kleine Bonusfunktionen von uns hinzugefügt.
Wir glauben, dass dies der richtige Weg der sprachenorientierten Programmierung ist, die das Beste aus anderen Sprachen macht und sie an die eigenen Bedürfnisse anpasst. Lesen Sie dazu später in unseren kommenden Artikeln zur Erstellung von Spracherweiterungen.
Erstellen Sie ein neues Projekt mit einem Modul darin.
Rufen Sie die neuen Root-Operatoren auf?.
Fügen Sie der Hauptklasse Code zum Testen hinzu.
Hier haben wir zwei Variablen erstellt, p1 und p2 (Typ Point). Nun möchten wir eine dritte Variable, p3, erhalten, die sich aus der Kombination dieser beiden Punkte ergibt.
Geben Sie diese drei Werte aus: p1, p2, p3. Wir haben Ausdruck gebraucht Werte
aus der Sprache Protokollierung
um die String-Nachricht für die Konsolenausgabe zu implementieren.
Unser Code führt zu einer Fehlermeldung: "Operation kann nicht auf diese Operanden angewendet werden". Kompilieren ist unmöglich.
Lassen Sie uns den Operator für überladen erklären. Einführen com.realaxy.actionScript.overloadedOperators
.
Neues hinzufügen ?OverlodedOperatorsContainer
? root: Klicken Sie mit der rechten Maustaste auf den Paketknoten und wählen Sie aus einem Popup-Menü aus.
Nennen Sie es ?MeineOperatoren
?.
Hier sehen wir zwei Deklarationsblöcke: ?überladene binäre Operatoren
? und ?benutzerdefinierte Operator-Deklarationen
?.
Gehen Sie zum ersten Block und drücken Sie Eingeben. Eine neue Bedienererklärung wird hinzugefügt.
Wählen ?+
? Operator. Typ auswählen Punkt
für beide seiten. Rückgabewert setzen Punkt
(Ändern Sie den Standardwert ?Leere
? Rahmen).
Jetzt können wir einen Code hinzufügen, der beim Kombinieren ausgeführt wird Punkt
mit Punkt
(mit ?+
? Operator).
Das ist alles.
Das rote Highlight, das auf einen Fehler in unserer Klasse hinweist, ist verschwunden.
Beginnen Sie mit dem Kompilieren.
Erstellen Sie eine Laufkonfiguration für unser Modul.
Weisen Sie die Hauptklasse zu (wenn Sie dies nicht früher getan haben).
Wir erhalten die folgende Meldung auf der Konsole:
Versuchen wir nun, eine etwas anspruchsvollere Aufgabe zu erledigen und die Vorgänge der Subtraktion, Multiplikation und Division neu zu definieren. Für beide Nummer
und Punkt
.
Operator + (Punkt, Punkt) -> Punkt kommutativ: falsch (links, rechts) -> Punkt Neuen Punkt zurückgeben (links.x + rechts.x, links.y + rechts.y); Operator + (Punkt, Zahl) -> Punkt kommutativ: falsch (links, rechts) -> Punkt Neuen Punkt zurückgeben (links.x + rechts, links.y + rechts); Operator - (Punkt, Punkt) -> Punkt kommutativ: falsch (links, rechts) -> Punkt Neuen Punkt zurückgeben (links.x - rechts.x, links.y - rechts.y); Operator - (Punkt, Zahl) -> Punkt kommutativ: falsch (links, rechts) -> Punkt Neuen Punkt zurückgeben (links.x - rechts, links.y - rechts); Operator * (Punkt, Punkt) -> Punkt kommutativ: falsch (links, rechts) -> Punkt Neuen Punkt zurückgeben (left.x * right.x, left.y * right.y); Operator * (Punkt, Zahl) -> Punkt kommutativ: falsch (links, rechts) -> Punkt Neuen Punkt zurückgeben (links.x * rechts, links.y * rechts); Operator / (Punkt, Punkt) -> Punkt kommutativ: falsch (links, rechts) -> Punkt Neuen Punkt zurückgeben (links.x / rechts.x, links.y / rechts.y); Operator / (Punkt, Zahl) -> Punkt kommutativ: falsch (links, rechts) -> Punkt Neuen Punkt zurückgeben (links.x / rechts, links.y / rechts);
Stellen Sie sich vor, Sie müssen einen Punkt berechnen, der links und um 50 Pixel vom Mittelpunkt des Abstands zwischen den beiden Punkten entfernt ist.
Das ist einfach:
Oder noch einfacher:
Aber vergiss nicht, dass es im wirklichen Leben eines Flashers so wäre:
Vergleichen Sie diese Zahlen. Grund genug, das Überladen von Operatoren in ActionScript-Projekten zu verwenden.
Lassen Sie uns nun lernen, wie Sie eigene benutzerdefinierte Operatoren erstellen.
Zuerst zurück zu MeineOperatoren
Erklärung und gehen Sie zu benutzerdefinierte Operator-Deklarationen
.
Drücken Sie Eingeben eine neue Deklaration erstellen. Visuelle Darstellung wäre ~ =
.
Unser benutzerdefinierter Operator muss eine Zeichenfolge auf Übereinstimmung mit einem regulären Ausdruck überprüfen. Um das Verhalten dieses Operators zu beschreiben, fügen wir eine neue Überladung hinzu, genau wie wir es vor 10 Minuten mit getan haben Punkt
. Der einzige Unterschied ist das Hinzufügen ~ =
autovervollständigen.
Der linke Operand muss a aufnehmen String
, während der richtige sein muss RegExp
. Rückgabewert sollte sein Boolean
.
Fügen Sie dann Code hinzu, der von unserem Operator ausgeführt werden soll Prüfung
Methode aus dem Wert.
Erstellen Sie einen Testvorgang in Haupt ()
um zu sehen wie es funktioniert:
Schnell und einfach.
Um Verwirrung bei all diesen benutzerdefinierten Operatoren zu vermeiden, sollten Sie sich eine einzige Tastenkombination merken, die mit der Navigation zusammenhängt: Strg-B (oder Strg + Klick auf einem Bediener) führt Sie zur Bedienererklärung.
Ein guter Tipp: Um einen Unterschied zwischen einem nachgeladenen Operator und einem integrierten Operator zu machen, bewegen Sie den Mauszeiger darauf und drücken Sie Ctrl.
Natürlich, wenn Sie auf einem Mac sind, verwenden Sie Cmd anstatt Ctrl.
Lassen Sie uns das Verhalten unseres benutzerdefinierten Operators um eine neue Funktion erweitern, Kommutativität.
Wählen Sie den Operator aus und drücken Sie Alt-Enter. Wählen Binäre Operation kippen
aus einem Popup-Menü. Dadurch werden die beiden Seiten jedoch mit einer Fehlermeldung ausgetauscht, weil ~ =
Operator ist noch nicht für solche Operanden definiert.
Fahren Sie mit der Bedienererklärung fort. einstellen Kommutativ = wahr
. Die rote Fehlerhervorhebung sollte verschwinden (manchmal sollten Sie F5 drücken, um eine Ansicht zu aktualisieren).
Mit anderen Worten, dies ?kommutativ
? Die Einstellung ist eine gute alte Regel, dass das Ändern der Reihenfolge der Summanden die Summe nicht ändert. Nun unser ~ =
Der Operator funktioniert weiterhin, wenn wir den RegExp vor den String setzen.
OOP-Gurus warnen davor, dieses Verhalten zu missbrauchen. Manchmal beinhaltet es unerwartete Auswirkungen. Nehmen wir es auf den Glauben und erinnern uns daran.
Das ist alles dazu. In ActionScript 3 gibt es eine Überladung der Operatoren.