Destruktor der Basisklasse einer abgeleiteten Klasse wird nicht ausgeführt
Manfred Meise 6 Juni 2013 18:35:59
- Verwendung von abgeleiteten Klassen
- Umfangreiche Fehlerbehandlung in allen Methoden
- Verwendung von Codeschablonen im Domino Designer für Eclipse (DDE)
So musste ich jüngst die Ursache finden, warum bei abgeleiteten Klassen der Destruktur (Sub Delete) der Basisklasse nicht ausgeführt wird, obwohl der Desktruktor der abgeleiteten Klasse sehr wohl ausgeführt wird.
Class BaseClass
Public Status As String
Public Sub new (intNumber As Integer)
MessageBox "BaseClass",,"New"
End Sub
Sub Delete
MessageBox "BaseClass",,"Delete"
End Sub
End Class
Class DerivedClass As BaseClass
Public Sub New (intNumber As Integer), BaseClass (intNumber)
MessageBox "DerivedClass",,"New"
End Sub
Sub Delete
MessageBox "DerivedClass",,"Delete"
End Sub
End Class
So sollte z.B. folgender Code
Public Sub CreateClass
Set currentClass = New DerivedClass (1)
Delete currentClass
End Sub
Zunächst den Konstruktor von "BaseClass" und danach von "DerivedClass" während der Instanziierung und der Desktruktur von "DerivedClass" gefolgt vom Destruktor der "BaseClass" durchlaufen werden.
Hat man sich jedoch ein CodeTemplate im Designer angelegt, um jede Methode einer Klasse mit Fehlerbandlung auszustatten, so entsteht z.B. folgender Code
Class BaseClass
Public Status As String
Public Sub new (intNumber As Integer)
On Error GoTo ErrorBubble
MessageBox "BaseClass",,"New"
SingleExit:
Exit Sub
'......................................................................................................
ErrorBubble:
Error Err, Error & Chr(13) & { --> in } & TypeName(Me) & {.} & GetThreadInfo (LSI_THREAD_PROC) & { : } & Erl
Resume SingleExit
End Sub
Sub Delete
On Error GoTo ErrorBubble
MessageBox "BaseClass",,"Delete"
SingleExit:
Exit Sub
'......................................................................................................
ErrorBubble:
Error Err, Error & Chr(13) & { --> in } & TypeName(Me) & {.} & GetThreadInfo (LSI_THREAD_PROC) & { : } & Erl
Resume SingleExit
End Sub
End Class
Class DerivedClass As BaseClass
Public Sub New (intNumber As Integer), BaseClass (intNumber)
On Error GoTo ErrorBubble
MessageBox "DerivedClass",,"New"
SingleExit:
Exit Sub
'......................................................................................................
ErrorBubble:
Error Err, Error & Chr(13) & { --> in } & TypeName(Me) & {.} & GetThreadInfo (LSI_THREAD_PROC) & { : } & Erl
Resume SingleExit
End Sub
Sub Delete
On Error GoTo ErrorBubble
MessageBox "DerivedClass",,"Delete"
SingleExit:
Exit Sub
'......................................................................................................
ErrorBubble:
Error Err, Error & Chr(13) & { --> in } & TypeName(Me) & {.} & GetThreadInfo (LSI_THREAD_PROC) & { : } & Erl
Resume SingleExit
End Sub
End Class
Hierdurch schleicht sich allerdings ein "Exit Sub" in die Destruktor Methode der abgeleiteten Klasse ein. Während dieses im Konstruktor keine Seiteneffekte hat, führt dieses beim Destruktor dazu, dass die Methode der Basisklasse nicht mehr ausgeführt wird.
Zielgruppe: Entwickler Kategorien: LotusScript Diskussion: Kommentare [0]