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