Ist es möglich, Operatoren in Smalltalk zu überladen?
Ich bin auf der Suche nach Anleitungen/Beispielen.
Danke.
Ist es möglich, Operatoren in Smalltalk zu überladen?
Ich bin auf der Suche nach Anleitungen/Beispielen.
Danke.
Das Überladen von Methoden ist in Smalltalk nicht möglich. Stattdessen wird eine Kombination aus Methodenüberschreibung und einer Technik namens Doppelversand wird verwendet, um das gleiche Verhalten wie das Überladen von Operatoren in anderen Sprachen zu implementieren.
Eine Beispielimplementierung finden Sie unter den mathematischen Operatoren +,*,/,-
(die in Smalltalk binäre Nachrichten sind). Hier ist die Idee: Die Implementierung von Integer>>+
sendet eine Nachricht #addWithInteger:
zu seinem Argument. Die Implementierung von #addWithInteger:
ist in jeder Magnitude-Unterklasse implementiert, um z. B. die Addition von Int+Int, Float+Int usw. zu spezialisieren.
Zum größten Teil sind Dinge, die in anderen Sprachen Operatoren sind, in Smalltalk unäre oder binäre Nachrichten wie +, *, /, ... usw. Es steht den Klassen frei, auf diese Nachrichten so zu reagieren, wie sie es für richtig halten, also ja, Sie können das Verhalten von + neu definieren, und Sie können auch Instanzen einiger Nicht-Zahlenklassen dazu bringen, es zu verstehen und darauf zu reagieren.
Sehen Sie sich zum Beispiel die Implementierung von + in der Klasse Point an.
Zu beachten ist, dass := und ^ keine Nachrichten sind und daher nicht auf die oben beschriebene Weise umdefiniert werden können.
Übrigens ist das Smalltalk-Image eine der besten Quellen für Beispiele und Code, um Smalltalk zu lernen. Ich empfehle Ihnen also, Smalltalk zu starten und sich durch die große Menge an Beispielen, die es enthält, durchzuarbeiten.
In Smalltalk gibt es keine Operatoren, außer Zuweisungen. Alles wird in Klassen als Methoden implementiert. Wenn Sie also das Verhalten von = oder + / - Methoden ändern wollen, schauen Sie sich einfach deren Implementierer an. Oder wenn Sie Instanzen Ihrer Klasse erstellen wollen, um diese Nachrichten zu verstehen, implementieren Sie sie einfach.
El operator-overloading
Tag ist auf Stack Overflow definiert als
ein Merkmal einer Programmiersprache, das benutzerdefinierte Implementierungen für Operatoren in Abhängigkeit von den Typen der beteiligten Operanden ermöglicht. In einigen Sprachen können neue Operatoren definiert werden, während andere nur die Neudefinition bestehender Operatoren erlauben.
In Smalltalk
Alle Typen sind als Klassen von Objekten definiert *
Alle Operatoren sind Methoden *
Alle Methoden werden von dem Empfänger der Nachricht mit dem Namen der Methode ausgeführt
Alle Methoden können außer Kraft gesetzt werden
So kann jeder Operator, der auf einen beliebigen Operanden wirkt, von jedem Entwickler außer Kraft gesetzt werden.
Hier sind einige Beispiele:
Objekte der Klasse Float
, Klasse SmallInt
, Klasse Fraction
und Klasse Point
können alle auf eine +
Nachricht. Sie können auch miteinander interagieren.
aFloat := 3.1415 . aSmallInt := '6' . aPoint := 3@3 . aFraction := 22/7 .
"Schicken Sie die + aSmallInt
Nachricht an aFraction
"
aSum := aFraction + aSmallInt
Bewertet nach: 64/7
"Schicken Sie die + aFraction
Nachricht an aSmallInt
"
aSum := aSmallInt + aFraction
Bewertet nach: 64/7
aSum := aFloat + aFraction aSum := aFraction + aFloat
Diese bewerten zu: 6.284357142857143
aSum := aFloat + aSmallInt aSum := aSmallInt + aFloat
Diese bewerten zu: 9.1415
aSum := aPoint + aSmallInt aSum := aSmallInt + aPoint
Diese bewerten zu: 9@9
In der Tat haben wir 8 verschiedene Implementierungen des +
Operatoren, die jeweils auf die Typen der beteiligten Operanden zugeschnitten sind.
Die Vorbehalte: * Objekte sind nicht stark typisiert. Jede Variable eines Typs kann in jeden anderen Typ geändert werden, ohne dass das System eine Ausnahme auslöst. Ein Objekt kann als Objekt der Klasse SmallInt beginnen und dann in einen ByteString oder ein Dictionary geändert werden, und das System löst nicht die geringste Warnung aus. Bis es eine Nachricht erhält, die es nicht versteht.
Es gibt 6 Primitive, die weder ein Objekt noch eine Objektklasse sind: true, false, nil, etc.
Es gibt zwei Operatoren, die im Grunde genommen syntaktischer Zucker für benannte Methoden sind.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.