5.5 Referenzen, Vergleiche und Typen
Mithilfe einer Zuweisung kann einem Objektverweis A ein gleichartiger Objektverweis B zugewiesen werden. Beachten Sie dabei allerdings, dass nicht das Objekt, sondern nur eine Referenz (der Objektverweis) zugewiesen wurde. Die Objektverweise A und B verweisen nach der Zuweisung auf dasselbe Objekt. Falls im weiteren Verlauf des Programms eine Veränderung über einen der beiden Objektverweise vorgenommen wird, hat dies Auswirkungen auf dasselbe Objekt.
Bei der Übergabe von Parametern an eine Prozedur oder Funktion haben wir bereits ein ähnliches Verhalten kennengelernt. Wenn ein Parameter mit ByRef übergeben wurde, dann hatte eine Änderung Auswirkungen auf die Original-Variable. Dieser Vorgang wurde daher auch als Übergabe per Referenz bezeichnet.
Anders verhält es sich bekanntlich bei der Zuweisung einer Variablen eines Basis-Datentyps (z. B. Integer oder Double). Nach der Zuweisung einer Variablen A an eine Variable B haben zwar beide zunächst den gleichen Wert, es handelt sich aber um zwei verschiedene Variablen, die im weiteren Verlauf des Programms unabhängig voneinander agieren können. Bezüglich dieses Verhaltens spricht man auch von Referenztypen (Objekte) und Werttypen (Variablen der Basis-Datentypen).
Mithilfe des Operators Is können Sie feststellen, ob zwei Objektverweise auf dasselbe Objekt verweisen.
Es folgt ein Beispielprogramm (Projekt ReferenzenVergleicheTypen), das diese Zusammenhänge verdeutlicht. Die Definition der Klasse ähnelt derjenigen im vorherigen Projekt Konstruktor, daher muss sie hier nicht mehr gesondert dargestellt werden.
Public Class Form1
Private Sub cmdReferenzZuweisen_Click(...) Handles ...
Dim vespa As New Fahrzeug("Moped", 50)
Dim schwalbe As Fahrzeug
schwalbe = vespa
MessageBox.Show(vespa.ausgabe() &
" / " & schwalbe.ausgabe())
vespa.beschleunigen(35)
MessageBox.Show(vespa.ausgabe() &
" / " & schwalbe.ausgabe())
End Sub
Private Sub cmdReferenzenVergleichen_Click(
...) Handles ...
Dim vespa As New Fahrzeug("Roller", 35)
Dim schwalbe As New Fahrzeug("Roller", 35)
If vespa Is schwalbe Then
MessageBox.Show("Die beiden Objekt" &
"verweise zeigen auf dasselbe Objekt")
Else
MessageBox.Show("Die beiden Objekt" &
"verweise zeigen nicht auf dasselbe Objekt")
End If
End Sub
...
End Class
Listing 5.8 Projekt »ReferenzenVergleicheTypen«, Teil 1
Zur Erläuterung:
- Nach der Erzeugung eines Objekts (mit New) und eines Objektverweises (ohne New) der Klasse Fahrzeug erfolgt die Zuweisung des Objekts zum zweiten Objektverweis.
- Damit sind schwalbe und vespa Verweise auf dasselbe Objekt. Wird vespa beschleunigt, so erfährt man auch über schwalbe diese Veränderung, siehe Abbildung 5.5.
Abbildung 5.5 Zwei Verweise auf ein Objekt
- In der zweiten Prozedur werden zwei Objekte mit denselben Eigenschaftswerten erzeugt. Der Vergleich mithilfe des Operators Is zeigt, dass es sich aber nicht um dasselbe Objekt handelt, siehe Abbildung 5.6.
Abbildung 5.6 Zwei verschiedene Objekte
5.5.1 Objekte vergleichen
In diesem Zusammenhang ist auch die Methode Equals() der Basisklasse Object von Interesse. Diese Methode erbt jede Klasse, weil jede Klasse von der Basisklasse Object abgeleitet wird. Das Thema Vererbung wird im Abschnitt 5.8 noch vertieft.
Falls Sie die geerbte Methode Equals() auf zwei Objektverweise einer Klasse anwenden, dann wird damit festgestellt, ob die Verweise auf dasselbe Objekt verweisen. Es handelt sich also um das gleiche Verhalten wie beim Operator Is.
Die Methode Equals() ist aber eigentlich dazu vorgesehen, festzustellen, ob zwei Objekte identisch sind. Dazu muss sie in der betreffenden Klasse überschrieben werden.
Dazu wird die Klasse Fahrzeug im Projekt ReferenzenVergleicheTypen wie folgt ergänzt:
Public Class Fahrzeug
[ ... ]
Overloads Function Equals(x As Fahrzeug) As Boolean
If bezeichnung = x.bezeichnung And
geschwindigkeit = x.geschwindigkeit Then
Equals = True
Else
Equals = False
End If
End Function
End Class
Listing 5.9 Projekt »ReferenzenVergleicheTypen«, Methode »Equals()«
Zur Erläuterung:
- Die Funktion liefert True, wenn die Werte der beiden Eigenschaften bezeichnung und geschwindigkeit gleich sind.
Das folgende Beispielprogramm (ebenfalls im Projekt ReferenzenVergleicheTypen) verwendet die veränderte Klasse Fahrzeug:
Public Class Form1
[...]
Private Sub cmdObjekteVergleichen_Click(...) Handles ...
Dim vespa As New Fahrzeug("Roller", 35)
Dim schwalbe As New Fahrzeug("Roller", 35)
If vespa.Equals(schwalbe) Then
MessageBox.Show("Die beiden Objekte" &
" sind gleich")
Else
MessageBox.Show("Die beiden Objekte" &
" sind nicht gleich")
End If
End Sub
End Class
Listing 5.10 Projekt »ReferenzenVergleicheTypen«, Nutzung der Methode »Equals()«
Zur Erläuterung:
- Beim Vergleich wird nun die eigene Methode Equals() der Klasse Fahrzeug aufgerufen.
- Es werden die Werte der Eigenschaften verglichen. Diese sind gleich, also liefert die Methode Equals() den Wert True.
5.5.2 Typ eines Objekts ermitteln
Die Methode GetType() der Basisklasse Object liefert die Bezeichnung des Typs, also der Klasse eines Objekts. Diese Bezeichnung kann mithilfe der Methode ToString() ausgegeben werden. Das folgende Beispielprogramm (ebenfalls im Projekt ReferenzenVergleicheTypen) zeigt dies:
Private Sub cmdKlasseErmitteln_Click(...) Handles ...
Dim vespa As New Fahrzeug("Roller", 35)
Dim schwalbe As Fahrzeug
MessageBox.Show("Objekt vespa ist vom Typ " &
vespa.GetType().ToString)
If Not schwalbe Is Nothing Then
MessageBox.Show("Objekt schwalbe ist vom Typ " &
schwalbe.GetType().ToString)
End If
MessageBox.Show("Der Button ist vom Typ " &
cmdKlasseErmitteln.GetType().ToString)
End Sub
Listing 5.11 Projekt ReferenzenVergleicheTypen, Typ ermitteln
Zur Erläuterung:
- Es wird das Objekt vespa vom Typ Fahrzeug erzeugt. Die Methode GetType() liefert dann die Bezeichnung ReferenzenVergleicheTypen.Fahrzeug, also den Namen der eigenen Klasse Fahrzeug innerhalb des Namensraums des Projekts.
- Es wird der Objektverweis schwalbe erzeugt. Dieser verweist auf kein Objekt, also kann GetType() nicht angewendet werden. Der Verweis Nothing ist ein Verweis auf »Nichts«. Is Nothing stellt fest, ob der betreffende Verweis auf nichts verweist. Not Is Nothing ist die Umkehrung. Es stellt also fest, ob der betreffende Verweis auf »Etwas« verweist. Nur dann kann GetType() angewandt werden.
- Die Methode GetType() liefert für den Button die Bezeichnung System.Windows.Forms.Button, also den Namen der Klasse Button innerhalb des Namensraums System.Windows.Forms.
5.5.3 Typ eines Objekts durch Vergleich ermitteln
Falls Sie wissen möchten, ob ein Objekt von einem bestimmten Typ ist, so können Sie die Operatorenkombination TypeOf ... Is anwenden. Das folgende Beispielprogramm (ebenfalls im Projekt ReferenzenVergleicheTypen) zeigt dies:
Private Sub cmdKlasseVergleichen_Click(...) Handles ...
Dim vespa As New Fahrzeug("Roller", 35)
Dim schwalbe As Fahrzeug
If TypeOf vespa Is Fahrzeug Then
MessageBox.Show("Objekt vespa ist" &
" vom Typ Fahrzeug")
End If
If Not TypeOf schwalbe Is Fahrzeug Then
MessageBox.Show("Objekt schwalbe ist" &
" (noch) nicht vom Typ Fahrzeug")
End If
End Sub
Listing 5.12 Projekt ReferenzenVergleicheTypen, Typ durch Vergleich ermitteln
Zur Erläuterung:
- Es wird das Objekt vespa vom Typ Fahrzeug erzeugt. TypeOf ... Is liefert dann True.
- Umgekehrt verhält es sich beim Objektverweis schwalbe, der auf kein Objekt des Typs Fahrzeug verweist. TypeOf ... Is liefert dann False.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.