Visual Basic 6: Klassen und Objekte

Klassen und Objekte Bearbeiten

Oft sollen durch Programme Vorgänge der Wirklichkeit dargestellt werden. In Firmen müssen zum Beispiel die Angestellten verwaltet werden. Wenn man nun für jeden Angestellten eigene Variablen einrichten müsste (intMüllerGehalt,...) ergeben sich einige Nachteile: Wenn ein Mitarbeiter entlassen oder neu eingestellt wird, muss das Programm neu geschrieben werden. Durch Klassen ist es möglich alle Eigenschaften des Angestellten, die für die Firma wichtig sind, zusammenzufassen und in einer Klasse zu verwalten.

Bevor man anfängt, eine Klasse zu programmieren, ist es notwendig, die relevanten Daten zu bestimmen. (Irrelevant sind z.B.: Haut-, Haarfarbe) Dieser Vorgang heißt Datenmodellierung.

Um eine neue Klasse hinzuzufügen, gehen Sie auf Projekt - Klassenmodul hinzufügen - Öffnen. Bei den Eigenschaften der Klasse ändern Sie den Namen auf " clsAngestellter", je nachdem, zu welchem Zweck Ihre Klasse dienen soll.

Verwendung einer Klasse Bearbeiten

Wenn man ein Objekt (eine Instanz einer Klasse) erzeugen will, geht man so vor:

Dim Angestellter As New clsAngestellter

Durch das Schlüsselwort New wird das Objekt intialisiert. Will man das verhindern, so schreibt man

Dim Angestellter As clsAngestellter

Allerdings kann das Objekt Angestellter so noch nicht verwendet werden. Zuerst muss es mit

Set Angestellter = New clsAngestellter

initialisiert werden.

Eigenschaften der Klasse Bearbeiten

Es gibt zwei Möglichkeiten eine Eigenschaft einer Klasse hinzuzufügen:

Man deklariert die Eigenschaft als Public Variable

Public Name As String

oder als Property

Dim strName As String

Public Property Get Name() As Variant
 Name = strName
End Property

Public Property Set Name(ByVal vNewValue As Variant)
 strName = vNewValue
End Property

Wenn man die Eigenschaft als Property deklariert, kann man bei einer Änderung der Eigenschaft überprüfen, ob der neue Wert gültig ist.

Auf diese Eigenschaft kann jetzt mit Objekt.Name zugegriffen werden:

Angestellter.Name = "Michael Müller"
MsgBox Angestellter.Name 'Gibt Meldung mit dem Inhalt Michael Müller aus

Methoden der Klasse Bearbeiten

Will man nun nicht nur Eigenschaften setzen, sondern auch bestimmte häufig verwendete Aktionen automatisieren und zusammenfassen, sodass sie leichter auszuführen sind. Dies erreicht man mit Methoden, die man der Klasse zuweist. Dies geschieht einfach mittels eines Public Sub Prozedurname. So können wir das Ausgeben des Namens in einer MsgBox vereinfachen:

Public Sub Ausgabe()
 MsgBox strName
End Sub

Nun muss man nur noch Objekt.Ausgabe aufrufen und der Name wird sofort an die MsgBox übergeben:

Angestellter.Name = "Michael Müller"
Angestellter.Ausgabe

Will man nun erreichen, dass die Methode einen Wert zurückliefert - zum Beispiel, um anzuzeigen, dass der Prozess erfolgreich abgeschlossen wurde - muss man anstelle einer Prozedur eine Funktion verwenden:

Public Function Ausgabe() as String
 MsgBox strName
 Ausgabe = "Fertig!"
End Function

Nun können wir auch den Rückgabewert der Methode ausgeben:

Dim strRückgabe as String
Angestellter.Name = "Michael Müller"
strRückgabe = Angestellter.Ausgabe
MsgBox strRückgabe

Es erscheint ein Fenster mit dem Inhalt "Fertig!". Die neue Variable strRückgabe hat hier den Rückgabewert der Methode aufgenommen.

Ereignisse von Klassen Bearbeiten

Es kann vorkommen, dass eine Klasse praktisch "Im Hintergrund" weiterarbeitet und dabei Ergebnisse produziert, von denen unser Programm gar nichts mitbekommt. Mit dem bisher gelernten müsste man also ständig die Eigenschaften abfragen bzw. Methoden aufrufen, um die Ergebnisse zu erhalten. Dass dies nicht sonderlich performant ist, liegt auf der Hand. Klassen bieten aus diesem Grunde noch Ereignisse, die sie aus dem Quellcode der jeweiligen Klasse heraus aufrufen können. Dabei kann jedes Ereignis Argumente übernehmen, allerdings keinen Wert zurückgeben. Um einer Klasse ein Ereignis hinzuzufügen, ist folgender Code nötig:

  Event NameDesEreignisses(Parameter1, Parameter2, ...)

Die Parameterliste ist aber wie gesagt optional. Ein solches Ereignis wird in dem Code der Klasse nun mit RaiseEvent aufgerufen:

  RaiseEvent NameDesEreignisses(Parameter1, Parameter2, ...)

Das ganze nützt jetzt aber dem Programm, das die Klasse verwendet, noch gar nichts. Um die Ereignisse auswerten zu können, muss die Deklaration ein wenig angepasst werden:

  Private WithEvents Klasse As clsKlasse

Beachten Sie, dass sie auf diesem Wege die Klasse nicht direkt initialisieren können, dies muss über

  Set Klasse = New clsKlasse

geschehen. Außerdem muss die Deklaration der Klasse auf Modulebene stattfinden, auf Prozedurebene können keine Instanzen erstellt werden, die Ereignisse unterstützen. Sie können dennoch Instanzen auf Prozedurebene erstellen, diesen darf dann allerdings nicht das WithEvents-Schlüsselwort enthalten.

Konstruktor und Destruktor Bearbeiten

Wenn Sie sich einmal die Ereignisse angeschaut haben, die Ihnen in einem Klassenmodul zur Verfügung stehen, kennen Sie wahrscheinlich schon Initialize und Terminate. Diese Ereignisse werden beim Erstellen einer Instanz bzw. Zerstören derselbigen ausgelöst und ermöglichen Ihnen, bspw. bestimmte Werte von vornherein zu setzen oder Aufräumarbeiten auszuführen. Stellen Sie sich einmal vor, Sie haben eine Klasse geschrieben, die mehrere Werte benötigt, die über Eigenschaften zugewiesen werden. Nun wäre es Overkill, nach der Erstellung einer Instanz jedesmal diese Werte von Hand setzen zu müssen, wenn sie normalerweise gleich sind. Hier kommt der sogenannte Konstruktor ins Spiel: Dieser wird aufgerufen, sobald eine Instanz erzeugt wurde:

  Private Wert1 As Long, Wert2 As Long, Wert3 As Long
  
  Private Sub Class_Initialize()
     Wert1 = 5
     Wert2 = 10
     Wert3 = 15
     ' ...
  End Sub

Das Gegenstück zum Konstruktor ist der Destruktor, dieser wird aufgerufen, sobald die Instanz der Klasse zerstört wird. Dies ist also der optimale Platz, um andere verwendete Objekte zu zerstören, ggf. reservierten Speicher freizugeben usw.. In folgendem Beispiel wird einfach das Destroy-Ereignis der Klasse aufgerufen, um deutlich zu machen, dass der Destruktor aufgerufen wurde.

  Event Destroy()
  
  Private Sub Class_Terminate()
     RaiseEvent Destroy
  End Sub