5.8 Vererbung
Eine Klasse kann ihre Elemente an eine andere Klasse vererben. Dieser Mechanismus wird häufig angewendet, um bereits vorhandene Definitionen übernehmen zu können. Man erzeugt durch Vererbung eine Hierarchie von Klassen, die die Darstellung von Objekten mit teils übereinstimmenden, teils unterschiedlichen Merkmalen ermöglichen.
Visual Basic stellt bereits eine große Menge an Klassen zur Verfügung, die in eigenen Programmen geerbt werden können. Dadurch können Sie komplexe Objekte mit ihrem Verhalten, ihren Eigenschaften und Möglichkeiten in Ihr eigenes Programm einfügen.
In den Beispielen dieses Buchs wurde dies bereits vielfach praktiziert. So wurde beim Einfügen eines Formulars von der Klasse für Formulare geerbt. Alle Eigenschaften eines Formulars (Text, BackColor, Size, ...), alle Methoden eines Formulars (Close(), ...) und alle Ereignisse eines Formulars (Click, Load, Activated, ...) stehen nach dem Einfügen zur Verfügung.
Im nachfolgenden Beispiel im Projekt Vererbung wird eine Klasse PKW definiert, mit deren Hilfe die Eigenschaften und Methoden von Personenkraftwagen dargestellt werden sollen. Bei der Erzeugung bedienen Sie sich der existierenden Klasse Fahrzeug, in der ein Teil der gewünschten Eigenschaften und Methoden bereits vorhanden ist. Bei der Klasse PKW kommen noch einige Merkmale hinzu.
In diesem Zusammenhang nennt man die Klasse PKW auch eine spezialisierte Klasse. Die Klasse Fahrzeug nennt man eine allgemeine Klasse. Von der Klasse PKW aus gesehen ist die Klasse Fahrzeug eine Basisklasse. Von der Klasse Fahrzeug aus gesehen ist die Klasse PKW eine abgeleitete Klasse.
Bei der Projekterzeugung werden beide Klassen in eigenen Klassendateien gespeichert, jeweils über den Menüpunkt Projekt • Klasse hinzufügen.
Zunächst die Basisklasse Fahrzeug:
Public Class Fahrzeug
Dim geschwindigkeit As Integer
Sub beschleunigen(wert As Integer)
geschwindigkeit += wert
End Sub
Function ausgabe() As String
ausgabe = "Geschwindigkeit: " &
geschwindigkeit & vbCrLf
End Function
End Class
Listing 5.16 Projekt »Vererbung«, Basisklasse »Fahrzeug«
Davon abgeleitet wird die Klasse PKW:
Public Class PKW
Inherits Fahrzeug
Dim insassen As Integer
Sub einsteigen(anzahl As Integer)
insassen += anzahl
End Sub
Overloads Function ausgabe() As String
ausgabe = "Insassen: " & insassen &
vbCrLf & MyBase.ausgabe()
End Function
End Class
Listing 5.17 Projekt »Vererbung«, abgeleitete Klasse »PKW«
Zur Erläuterung:
- Nach dem Beginn der Klassendefinition (Public Class PKW) folgt in der nächsten Zeile Inherits Fahrzeug. Dadurch wird gekennzeichnet, dass die Klasse PKW alle Elemente von der Klasse Fahrzeug erbt.
- Die Klasse PKW verfügt nun über zwei Eigenschaften: die geerbte Eigenschaft geschwindigkeit und die eigene Eigenschaft insassen.
- Außerdem verfügt sie über vier Methoden: die geerbten Methoden beschleunigen() und ausgabe(), sowie die eigenen Methoden einsteigen() und ausgabe().
- Da die Methode ausgabe() bereits in der Basisklasse mit der gleichen Signatur vorkommt, sollte die gleichnamige Methode der abgeleiteten Klasse durch Overloads besonders gekennzeichnet werden. Damit teilen Sie mit, dass diese Methode eine andere, gleichnamige Methode der Basisklasse überlädt.
- In der Methode ausgabe() der Klasse PKW benötigen Sie allerdings weiterhin die Methode der Basisklasse, denn sie soll alle Eigenschaften ausgeben und sich dabei möglichst der bereits vorhandenen Methode ausgabe() der Basisklasse bedienen. Die Elemente der Basisklasse erreichen Sie in einer abgeleiteten Klasse über MyBase.
Im Projekt Vererbung, das diese Klassen benutzt, werden zwei Objekte erzeugt, ein Objekt der Basisklasse und ein Objekt der abgeleiteten Klasse, siehe Abbildung 5.9.
Abbildung 5.9 Objekte der Basisklasse und der abgeleiteten Klasse
Der Programmcode:
Public Class Form1
Private Sub cmdAnzeigen_Click(...) Handles ...
Dim vespa As New Fahrzeug
Dim fiat As New PKW
vespa.beschleunigen(35)
lblAnzeige.Text = vespa.ausgabe()
lblAnzeige.Text &= vbCrLf & fiat.ausgabe()
fiat.einsteigen(3)
fiat.beschleunigen(30)
lblAnzeige.Text &= vbCrLf & fiat.ausgabe()
End Sub
End Class
Listing 5.18 Projekt »Vererbung«, Nutzung der Klassen
Zur Erläuterung:
- Im Programm werden zwei Objekte verschiedener Klassen erzeugt.
- Wenn eine Methode für ein Objekt einer abgeleiteten Klasse aufgerufen wird, dann wird diese Methode zunächst in dieser abgeleiteten Klasse gesucht. Falls sie dort gefunden wird, so wird sie aufgerufen. Anderenfalls wird sie eine Ebene höher, also in der Klasse gesucht, von der die Klasse des Objekts abgeleitet wurde. Falls sie dort auch nicht gefunden wird, wird wiederum die zugehörige Basisklasse durchsucht usw.
- Für das Objekt fiat der Klasse PKW werden die Methoden ausgabe() und einsteigen() aufgerufen. Diese werden zuerst in der Klasse PKW gefunden und ausgeführt.
- Innerhalb der Methode ausgabe() der Klasse PKW wird die Methode der Basisklasse Fahrzeug über MyBase aufgerufen und ausgeführt.
- Die Methode beschleunigen() wird für das Objekt fiat ebenfalls zunächst in der Klasse PKW gesucht, aber nicht gefunden. Da PKW von Fahrzeug geerbt hat, wird die Methode nun in der Klasse Fahrzeug gesucht, dort gefunden und ausgeführt.
Hinweis: Eigenschaften der Basisklasse sind von der abgeleiteten Klasse aus normalerweise nicht erreichbar, da sie in der Basisklasse gekapselt sind. Sie wurden mit dem Schlüsselwort Dim deklariert, das gleichbedeutend ist mit Private. Möchten Sie sie aber dennoch erreichbar machen, so haben Sie zwei Möglichkeiten:
- Sie deklarieren die Eigenschaften mit Public. Dann sind sie, wie standardgemäß auch die Methoden, öffentlich zugänglich und von überall aus zu erreichen. Dies widerspricht aber dem Prinzip der Datenkapselung.
- Deklarieren Sie die Eigenschaften mit Protected. Nun sind sie von der Klasse, in der sie deklariert wurden und von allen aus dieser abgeleiteten Klassen aus erreichbar. Somit bleibt noch eine gewisse Datenkapselung gewährleistet.
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.