Tutorial
Type als Objekt - Das UDT-Tutorial Teil 2
von MOD | Seite 1 von 3 |
Einleitung
Willkommen beim 2. Teil des Tutorials. Für diesen Teil sollte Teil 1 auf alle Fälle gelesen sein, die Beispiele ausprobiert und möglichst durch eigene Tests erweitert worden sein. Es folgen nun ein paar Themen, die in Teil 1 nicht enthalten waren.
Indizierte Properties (Die Arrayform)
Eine indiziertes Property ist ein Property, die sich wie ein Array verhält, außer dass wie bei einem regulären Property, eine Funktion aufgerufen wird, wenn darauf zugegriffen wird. Zum Anfang ein sehr kurzes Beispiel, nur um die Syntax zu zeigen:
Type foo
Declare Property bar(ByVal index As Integer, ByVal value As Integer)
Declare Property bar(ByVal index As Integer) As Integer
dummy As Integer
End Type
Property foo.bar(ByVal index As Integer, ByVal value As Integer)
Print "Property set, index=" & index & ", value=" & value
End Property
Property foo.bar(ByVal index As Integer) As Integer
Print "Property get, index=" & index
Property = 0
End Property
Dim baz As foo
baz.bar(0) = 42
Print baz.bar(0)
Wie man sieht, ist die Deklaration unseres indizierten Properties ziemlich ähnlich zu einem regulären Property, außer dass wir diesmal ein Argument für den Index angegeben haben. Der Type enthält ein Dummy-Integer Element, weil es wenigstens ein Datenelement haben muss. Wie man sieht, wird der Property dann mit (0) als Hinweis verwendet, was bedeutet, dass wir das nullte Element holen/setzen wollen, was dem ersten Element des Arrays entspricht. So wie wir das eben auch bei einem normalen Array tun würden.
Nun folgt ein etwas sinnvolleres Beispiel mit Beschreibung:
Type foo
Declare Constructor(ByVal num_elements As Integer)
Declare Destructor()
Declare Property bar(ByVal index As Integer, ByVal value As Integer)
Declare Property bar(ByVal index As Integer) As Integer
Private:
x As Integer Ptr
size As Integer
End Type
Constructor foo(ByVal num_elements As Integer)
x = Callocate(num_elements * SizeOf(Integer))
size = num_elements
End Constructor
Destructor foo()
DeAllocate(x)
End Destructor
Property foo.bar(ByVal index As Integer, ByVal value As Integer)
If (index >= 0) And (index < size) Then
x[index] = value
Else
Error 6
End If
End Property
Property foo.bar(ByVal index As Integer) As Integer
If (index >= 0) And (index < size) Then
Property = x[index]
Else
Error 6
End If
End Property
Dim baz As foo = foo(10)
baz.bar(1) = 42
Print baz.bar(1)
Diesmal wurden ein Constructor und Destructor hinzugefügt, die einen dynamischen Speicherbereich x reservieren und freigeben mit der Anzahl der Elemente, die im Constructor steht. Dann, wenn die Property-Funktionen ausgeführt werden, wird beim Index geprüft, ob er innerhalb der Array-Grenzen liegt und falls ja, wird das angeforderte Holen/Setzen ausgeführt. Ist der angegebene Index außerhalb der Grenzen, tritt 'Error 6' auf, damit das Programm mit FreeBASICs 'out of bounds error' abgebrochen werden kann. Dies kann natürlich durch eigene Fehlerbehandlungsroutinen ersetzt werden. Ausprobieren lässt sich das, indem der Code 'baz.bar(1) = 42' durch 'baz.bar(10) = 42' ersetzt wird. Da wir nur 10 Elemente (Index 0-9) angegeben haben, tritt dies dann in Aktion.
Die Art der Verwendung wird im Property-Tutorial natürlich auch erklärt.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|