7 Stimmen

Können Operatoren in Smalltalk überladen werden?

Ist es möglich, Operatoren in Smalltalk zu überladen?

Ich bin auf der Suche nach Anleitungen/Beispielen.

Danke.

18voto

Johan B Punkte 2336

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.

12voto

Davorin Ruševljan Punkte 4303

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.

6voto

Igor Stasenko Punkte 1037

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.

1voto

Euan M Punkte 1078

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.

0voto

David Farrell Punkte 842

In Smalltalk gibt es keine Operatoren, aber man kann etwas Ähnliches über die Definition/Überschreibung von Methoden erreichen:

Object subclass: Foo [ 
  + anObject [
    "define new behavior for + here"

  ]
]

CodeJaeger.com

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.

Powered by:

X