Tutorial
Überladen von Prozeduren und Operatoren (Overload)
von MOD | Seite 5 von 9 |
Bei den Operatoren gibt es Unterschiede, wie, oder treffender WO sie überladen werden können. Hierbei unterscheidet man globale Operatoren und Memberoperatoren.
Memberoperatoren müssen immer innerhalb des Types stehen. Dazu gehören:
- Let (Zuweisung)
- Cast (Typ umwandeln)
- [] (Indizierung)
- += (Addieren und Zuweisung)
- -= (Subtrahieren und Zuweisung)
- *= (Multiplizieren und Zuweisung)
- /= (Dividieren und Zuweisung)
- \= (Integerdivisidieren und Zuweisung)
- ^= (Exponieren und Zuweisung)
- &= (Anhängen und Zuweisung)
- Mod= (Modulus und Zuweisung)
- Shl= (Bitweise Verschiebung nach links und Zuweisung)
- Shr= (Bitweise Verschiebung nach rechts und Zuweisung)
- And= (Logisches AND und Zuweisung)
- Or= (Logisches OR und Zuweisung)
- Xor= (Logisches exklusives OR und Zuweisung)
- Imp= (Implikation und Zuweisung)
- Eqv= (Äquivalenz und Zuweisung)
- New
- New[]
- Delete
- Delete[]
Um diese Operatoren mit dem eigenen UDT verwenden zu können, müssen diese immer explizit deklariert und angegeben werden.
Dagegen die globalen Operatoren, die immer außerhalb des UDTs stehen müssen:
(Operatoren mit einem Operand):
(Operatoren mit zwei Operanden):
Globale Operatoren unterscheiden sich nochmals in ihrer Anzahl an Operanden. Während die einen nur einen Operand haben, der immer nach dem Operator steht (z.B.: Not 5, @myVar), haben die anderen zwei Operanden, bei denen einer vor und einer hinter dem Operator steht (z.B.: 5 + 9, myVar >= 7).
Es ist nicht immer nötig, einen globalen Operator zu überladen. Durch geschickte Überladung von Cast und Let bleibt es einem oft erspart. Ob das so ist, sollte natürlich getestet werden.
In unserem Beispiel gibt es keinen überladenen globalen Operator, da soweit alle funktioniert haben, der Vollständigkeit halber hier aber noch ein Beispiel, wie das aussehen kann:
Operator + (lhs As eigentlich_ein_string, rhs As eigentlich_ein_string) As eigentlich_ein_string
Return Val(lhs.daten) + Val(rhs.daten)
End Operator
Die Variablennamen 'lhs' (Left-Hand Side) und 'rhs' (Right-Hand Side) stehen dabei für den Operand vor ('lhs') und hinter ('rhs') des Operators. Sie sind aber keine Pflichtnamen, sorgen aber für einfacheres Verständnis und Vereinheitlichung des Codes.
Soll ein globaler Operator mit anderen Datentypen als dem eigenen Type kombiniert werden, muss er für jede mögliche Konstellation überladen werden.
Hinweis:
Momentan können nicht alle Operatoren überladen werden. So gibt der Versuch einer Überladung von '->' oder '*' (Pointer) einen Compilerfehler aus, mit dem Hinweis 'TODO', wenn sie innerhalb des Type deklariert werden. Global lassen sie sich zwar überladen, es dürfen dann aber keine Pointer auf den Typen übergeben werden, was nicht zielführend ist.
Auch der '@'-Operator verhält sich atypisch, da er immer innerhalb des UDTs deklariert werden muss.
Die Operatoren New[] und Delete[] sollten Static sein.
Die Operatoren Exp, Log, Sin, ASin, Cos, ACos, Tan und Atn sind erst ab Version 0.22.0 SVN überladbar.
Das Überladen von '[]' ist erst seit Version 0.91.0 möglich.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|