Referenz - STATIC (UDT)
Syntax:
Type typename
Declare Static Function functionname ...
Declare Static Sub subname ...
Declare Static Operator New[] ...
Declare Static Operator Delete[] ...
End Type
Typ: Klausel
Kategorie: Klassen
STATIC wird verwendet, um Methoden zu deklarieren, denen beim Aufruf keine implizite Instanz des UDTs mitgegeben werden soll. Dadurch kann diese statische Methode auch aufgerufen werden, ohne dass eine Instanz des UDTs existieren muss.
- 'typename' ist der Name des UDTs
- 'functionname' und 'subname' sind die Namen der Prozeduren
Beim Aufruf einer Methode (also einer innerhalb des UDTs deklarierten SUBs oder FUNCTION) wird für gewöhnlich implizit eine Instanz der zugehörigen UDT-Variablen mitgeben. Diese kann dann innerhalb der Methode mit THIS angesprochen werden. Dadurch ist ein Zugriff auf die Attribute des UDTs möglich. Bei der Deklaration einer 'static', also einer statischen Prozedur wird dagegen intern keine implizite Instanz des Objekts an die Prozedur übergeben, sodass nur Zugriff auf übergebene Parameter besteht.
Statische Memberprozeduren können nur auf andere statische Member (Attribute und Methoden) des UDTs zugreifen, nicht aber auf normale Member. Um dies doch zu tun, muss ein Objekt-Pointer als zusätzlicher Parameter übergeben werden. Außerhalb des UDTs kann eine statische Memberprozedur wie eine nicht statische verwendet werden. Die Adresse einer statischen Memberfunktion kann wie gewohnt mit Hilfe von PROCPTR oder dem @-Operator einem Function-Pointer zugewiesen werden.
STATIC funktioniert nur mit SUB, FUNCTION und den Operatoren NEW[] und DELETE[].
Beispiel:
'Ein Beispiel, wie man während der Laufzeit einen Pointer auf eine Prozedur innerhalb eines UDTs setzt
Type myType
Enum handlertype
ht_default
ht_A
ht_B
End Enum
Declare Constructor (ByVal ht As handlertype = ht_default)
Declare Sub handler
Private:
Declare Static Sub handler_default (ByRef obj As myType)
Declare Static Sub handler_A (ByRef obj As myType)
Declare Static Sub handler_B (ByRef obj As myType)
handler_func As Sub (ByRef obj As myType)
End Type
Constructor myType (ByVal ht As handlertype)
Select Case ht
Case ht_A
handler_func = @myType.handler_A
Case ht_B
handler_func = @myType.handler_B
Case Else
handler_func = @myType.handler_default
End Select
End Constructor
Sub myType.handler
handler_func(This)
End Sub
Sub myType.handler_default (ByRef obj As myType)
Print "Standardhandler"
End Sub
Sub myType.handler_A(ByRef obj As myType)
Print "Handler der Methode A"
End Sub
Sub myType.handler_B (ByRef obj As myType)
Print "Handler der Methode B"
End Sub
Dim objects(1 To 4) As myType => { myType.handlertype.ht_B, myType.handlertype.ht_default, myType.handlertype.ht_A }
'Das vierte Array-Element wird die Standardhandlermethode sein
For i As Integer = 1 To 4
Print i,
objects(i).handler()
Next
Sleep
Beispiel 2 - Verwendung einer statischen Memberprozedur wie eine nicht statische:
Type myType
Declare Static Function add (x As Integer, y As Integer) As Integer
dummy As Integer
End Type
Function myType.add (x As Integer, y As Integer) As Integer
Return x + y
End Function
Print myType.add (5, 3)
Sleep
Unterschiede zu QB: neu in FreeBASIC
Siehe auch:
STATIC (Anweisung), STATIC (Klausel), STATIC (Meta), STATIC (Schlüsselwort), DECLARE, TYPE, CLASS, Objektorientierung
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|