Tutorial
Überladen von Prozeduren und Operatoren (Overload)
von MOD | Seite 6 von 9 |
Jetzt können wir uns auch dem Thema der Iteratoren zuwenden.
Iteratoren sind Zeiger, auf Objekte einer Liste. For-Schleifen sind das Paradebeispiel eines Iterators, da dabei eine Liste von Daten eines Datentyps nacheinander durchlaufen werden. FreeBASIC bietet die Möglichkeit, diese zu überladen.
Für For gibt es mehrere Möglichkeiten der Verwendung:
Dim As Integer i
For i = 1 To 5
'Anweisungen
Next
For j As Integer = 1 To 5 Step 2
'Anweisungen
Next
For k As Integer = 5 To 1 Step -1
'Anweisungen
Next
Der 'For-Operator' hat keine direkte Funktion bei der For-Schleife, er nimmt höchstens den Variablentyp entgegen und muss auch nur deswegen überladen werden. Beim Überladen gibt es bei allen Iteratoren immer zwei Fälle. Der erste Fall, in dem For und Step keinen Übergabeparameter haben und Next nur einen und der zweite, bei dem For und Step einen Übergabeparameter haben und Next zwei. Das hat etwas mit Step zu tun, aber darauf komme ich gleich zu sprechen. Zunächst einmal die Deklaration von For:
Operator eigentlich_ein_string.For
'For ohne explizite Angabe von Step
End Operator
Operator eigentlich_ein_string.For (x As eigentlich_ein_string)
'For mit Angabe von Step
End Operator
Ähnlich sieht die Deklaration bei Step aus. Bei Step wird entschieden, auf welche Deklaration der Iteratoren zugegriffen wird. Wird Step angegeben, wird immer die jeweils zweite Version mit jeweils einem Übergabeparameter verwendet (bzw. bei Next mit zwei), wenn man Step dagegen in der For-Schleife weglässt, ist der Wert dafür immer '1' und es wird die erste Deklaration ausgewählt, die keine Parameter hat (und bei Next nur einen). Das hat den unschönen Nebeneffekt, dass man für diese Fälle unbedingt den Let-Operator für Integer überladen muss, sodass das Programm weiß, wie die '1' zum eigenen UDT umgesetzt werden muss. Jetzt aber zur Deklaration von Step:
Operator eigentlich_ein_string.Step
'Einfacher Step = Erhöhung um 1 in jedem Zyklus
this.daten = Str(ValInt(this.daten) + 1)
End Operator
Operator eigentlich_ein_string.Step (x As eigentlich_ein_string)
'Direkte Angabe von Step mit userdefiniertem Wert
this.daten = Str(ValInt(this.daten) + ValInt(x.daten))
End Operator
Das eigentliche Zugpferd der For-Schleife ist Next. Es kümmert sich um die Werte, die zwischen dem '=' (Ist gleich) und dem Step stehen. Es müssen wieder zwei Versionen beachtet werden, nämlich die, bei der Step nicht angegeben wird und der Wert damit immer '1' ist und die Version, bei der der Wert von Step mit einbezogen werden muss.
Operator eigentlich_ein_string.Next (x As eigentlich_ein_string) As Integer
'Next bei Schleife ohne Angabe von Step
Return ValInt(this.daten) <= ValInt(x.daten)
End Operator
Operator eigentlich_ein_string.Next (x As eigentlich_ein_string, y As eigentlich_ein_string) As Integer
'Next bei Schleife mit Angabe von Step - es muss überprüft werden, ob rauf- (Step 1) oder runtergezählt (Step -1) wird
If ValInt(y.daten) >= 0 Then
Return ValInt(this.daten) <= ValInt(x.daten)
Else
Return ValInt(this.daten) >= ValInt(x.daten)
EndIf
End Operator
Next gibt einen TRUE- oder FALSE-Wert aus, der daraus ermittelt wird, ob der Übergabewert größer oder kleiner dem Variableninhalt ist. Es stellt damit die Abbruchbedingung dar.
Wenn der aktuelle Zählwert größer oder kleiner dem letzten erlaubten Wert ist, dann wird FALSE ausgegeben und die For-Schleife verlassen.
Beispiele für die Verwendung von Iteratoren finden sich auch im "examples/classes/"-Ordner der FreeBASIC-Installation.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|