Referenz - DESTRUCTOR (Klassen)
Syntax:
TYPE TypeName
' Feld-Deklarationen
DECLARE DESTRUCTOR [ () ]
END TYPE
Synax B:
DESTRUCTOR Typename [ () ]
' Anweisungen
END DESTRUCTOR
Typ: Prozedur
Kategorie: Programmorganisation
Ein Klassen-Destruktor ist eine Prozedur, die aufgerufen wird, sobald eine UDT-Variable (user definded type - siehe TYPE (UDT)) zerstört wird.
Dieses Schlüsselwort ist nur zulässig, wenn mit der Kommandozeilenoption
-lang fb
kompilliert wird; siehe FB-Dialektformen.
- 'TypeName' ist der Name eines UDTs, wie er unter TYPE (UDT) erklärt wird.
- 'Feld-Deklarationen' sind die Deklarationen, die den UDT oder die Klasse ausmachen. Siehe dazu TYPE (UDT), PROPERTY, OPERATOR.
- Die Parameterliste muss bei Destruktoren leer sein.
- 'Anweisungen' ist ein Programmcode, der den Regeln einer SUB folgt.
Die Destruktor-Prozedur wird aufgerufen, sobald eine UDT-Variable zerstört wird. Dies ist dann der Fall, wenn das Programm beendet wird oder der SCOPE-Block, innerhalb dessen sie erstellt wurde, an ihr Ende kommt.
Innerhalb der
CONSTRUCTOR-Prozedur kann über das Schlüsselwort THIS auf die Records des UDTs zugegriffen werden.
Enthält der zu zerstörende UDT selbst Felder, die Klassen mit eigenen Destruktoren darstellen, so wird der Destruktor des UDTs vor denen der Records aufgerufen.
Innerhalb eines Types kann nur ein einziger Destruktor erstellt werden.
Klassen-Destruktoren MÜSSEN PUBLIC sein; siehe PUBLIC (UDT).
Das Destructor-Schlüsselwort leitet einen eigenen SCOPE-Block ein. Siehe dazu auch SCOPE.
Beispiel 1: Praxisnaher Einsatz zur automatischen Speicherfreigabe mit
DeAllocate:
TYPE T
intPtr AS INTEGER Ptr
DECLARE CONSTRUCTOR ( value AS INTEGER )
DECLARE DESTRUCTOR ( )
DECLARE OPERATOR CAST () AS STRING
END TYPE
CONSTRUCTOR T ( value AS INTEGER )
This.intPtr = ALLOCATE(1)
*This.intPtr = value
END CONSTRUCTOR
DESTRUCTOR T ()
DEALLOCATE This.intPtr
END DESTRUCTOR
OPERATOR T.Cast () AS STRING
RETURN STR(*This.intPtr)
END OPERATOR
DIM x AS T = 10
PRINT x
GETKEY
Ausgabe:
10
Beispiel 2: Zeitliche Abfolge des Erstellens und Zerstörens unter verschiedenen Bedingungen: Modulebene, Scope-Ebene, Prozedurebene.
TYPE T
value AS ZSTRING * 32
DECLARE CONSTRUCTOR ( init_value AS STRING )
DECLARE DESTRUCTOR ()
END TYPE
CONSTRUCTOR T ( init_value AS STRING )
value = init_value
PRINT "Erstelle: "; value
END CONSTRUCTOR
DESTRUCTOR T ()
PRINT "Zerstoere: "; value
END DESTRUCTOR
SUB MySub
DIM x AS T = ("MySub.x")
END SUB
DIM x AS T = ("main.x")
SCOPE
DIM x AS T = ("main.scope.x")
END SCOPE
MySub
SUB Quit DESTRUCTOR
GETKEY
END SUB
Ausgabe:
Erstelle: main.x
Erstelle: main.scope.x
Zerstoere: main.scope.x
Erstelle: MySub.x
Zerstoere: MySub.x
Zerstoere: main.xHinweis: Klassen-Destruktoren werden beim Benutzen des Befehls
End nicht aufgerufen, wohl aber
Modul-Destruktoren.
Unterschiede zu QB: Neu in FreeBASIC
Unterschiede zu älteren FreeBASIC-Versionen:
DESTRUCTOR für Klassen existiert seit FreeBASIC v0.17.
Siehe auch:
DESTRUCTOR (Module),
CONSTRUCTOR (Klassen),
TYPE (UDT),
NAMESPACE
| Zusätzliche Informationen und Funktionen | ||||
|---|---|---|---|---|
|
||||





Versionen