Referenz - DESTRUCTOR (Klassen)
Syntax A:
TYPE TypeName
' Feld-Deklarationen
DECLARE DESTRUCTOR [ () ]
END TYPE
Synax B:
DESTRUCTOR Typename [ () ]
' Anweisungen
END DESTRUCTOR
Typ: Prozedur
Kategorie: Klassen
Ein Klassen-Destruktor ist eine Prozedur, die aufgerufen wird, sobald eine UDT-Variable (user definded type - siehe TYPE (UDT)) zerstört wird.
- '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 eine mit NEW erstellte Variable mit DELETE zerstört wird, wenn der SCOPE-Block, innerhalb dessen die Variable erstellt wurde, an sein Ende kommt oder wenn das Programm beendet wird.
Achtung: Wird das Programm mit END beendet, findet kein automatischer Aufruf der Klassen-Destruktoren statt! Die Destruktoren müssen gegebenenfalls zuvor explizit aufgerufen werden. Modul-Destruktoren werden dagegen bei der Verwendung von END vor Programmende aufgerufen.
Innerhalb der Destruktor-Prozedur kann über das Schlüsselwort THIS auf die Attribute 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 Attribute aufgerufen.
Innerhalb eines Types kann nur ein einziger Destruktor erstellt werden.
Klassen-Destruktoren müssen PUBLIC sein.
Das Schlüsselwort DESTRUCTOR 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( SIZEOF(INTEGER) )
*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
SLEEP
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
SLEEP
END SUB
Ausgabe:
Erstelle: main.x
Erstelle: main.scope.x
Zerstoere: main.scope.x
Erstelle: MySub.x
Zerstoere: MySub.x
Zerstoere: main.x
Unterschiede zu QB: neu in FreeBASIC
Unterschiede zu früheren Versionen von FreeBASIC: DESTRUCTOR für Klassen existiert seit FreeBASIC v0.17.
Unterschiede unter den FB-Dialektformen: DESTRUCTOR ist nur in -lang fb zulässig.
Siehe auch:
DESTRUCTOR (Module), CONSTRUCTOR (Klassen), TYPE (UDT), NAMESPACE, Objektorientierung
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|