Twitter

 6.5.x  7.x  8.0.x  8.5.x 

Destruktor der Basisklasse einer abgeleiteten Klasse wird nicht ausgeführt

Manfred Meise  6 Juni 2013 18:35:59
 
Bei objektorientierter Entwicklung unter Verwendung von abgeleiteten Klassen kann man sich auch manchmal selbst im Weg stehen. So geschehen, wenn man einige (sonst sehr probate) Entwurfsprinzipien für LotusScript-Klassen
  • 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.