Objektorientierte Programmierung: Vererbung I

Eines der wichtigsten Merkmale der objektorientierten Programmierung ist die Vererbung. Dank der Vererbung kann man für ein Objekt eine Basisklasse erstellen, die grundlegende Eigenschaften und Methoden für dieses Objekt bereitstellt. Benötigen Sie nun ein weiteres Objekt, das auf dem ersten Objekt aufbaut, aber weitere oder geänderte Eigenschaften und Methoden enthält, müssten Sie ohne Vererbung die gleiche Klasse nochmal erstellen und nach ihren Wünschen anpassen. Dank Vererbung brauchen Sie in der Klasse für das neue Objekt jedoch nur die Erweiterungen und Änderungen zu definieren. Den Rest verwenden Sie von der ersten Klasse – und brauchen eine Menge Code nur an einer Stelle zu warten.

Sie können natürlich, genau wie bei Tabellen einer Datenbank, ein Objekt erstellen, das alle denkbaren Eigenschaften und Methoden liefert (beziehungsweise im Fall einer Tabelle entsprechende Felder enthält). Ein Beispiel wäre eine Tabelle, die zunächst nur Personendaten enthält, die dann aber um Daten für verschiedene Arten von Personen erweitert wird – für Mitarbeiter, Kunden et cetera.

In der Tabelle blieben dann, je nachdem, ob man einen Mitarbeiter oder einen Kunden pflegen möchte, die jeweils für den anderen Personentyp vorgesehenen Felder leer. Damit diese nicht versehentlich gefüllt werden, würde man dafür verschiedene Formulare vorsehen, von denen eines nur die Basisdaten plus die Mitarbeiterfelder und ein anderes nur die Basisdaten plus die Kundenfelder anzeigt.

Im Datenbankentwurf würde man hier nun eine Tabelle namens tblPersonen erstellen und für die jeweiligen Spezialisierungen Tabellen wie tblKunden oder tblMitarbeiter. Diese würden dann per 1:1-Beziehung miteinander verknüpft werden, damit nicht etwa die Daten eines Datensatzes der Tabelle tblKunden mehreren Datensätzen der Tabelle tblPersonen zugeordnet werden können und umgekehrt. Das Ergebnis sähe dann etwa in einer Access-Datenbank wie in Bild 1 aus.

Spezialisierung in einem Datenmodell

Bild 1: Spezialisierung in einem Datenmodell

In der objektorierten Programmierung sieht es ähnlich aus: Auch hier könnten Sie natürlich eine Klasse entwerfen, die sowohl die Basisdaten einer Person aufnehmen als auch die speziellen Daten für Mitarbeiter oder Kunden. Allerdings wird es dann schwer, bei der Programmierung immer nur genau die für den jeweiligen Typ gültigen Eigenschaften und Methoden zu nutzen, wenn immer alle Member etwa per IntelliSense angeboten werden.

Eine Alternative wäre es, jeweils eine Klasse für die Kunden und eine für die Mitarbeiter zu erstellen. Dabei würden beide jedoch eine Reihe identischer Eigenschaften enthalten wie zum Beispiel Vorname und Nachname. Und vielleicht gibt es auch noch Methoden, die Sie in beiden Klassen implementieren würden – wie etwa GeburtstagskarteSchicken. Diese müssten Sie dann erstens doppelt anlegen und zweitens Änderungen immer direkt in zwei Klassen durchführen.

Und hier kommt die Vererbung ins Spiel – auch die Ableitung von Klassen genannt: Sie erstellen dabei genau wie bei der Basistabelle für die Personendaten erst einmal eine Basisklasse etwa namens Person. Diese stellt Eigenschaften bereit, mit denen Sie Daten wie Vorname oder Nachname einstellen können.

Wenn Sie nun einen Kunden anlegen möchten, benötigen Sie eine weitere Klasse: nämlich eine solche, die von der Klasse Person erbt beziehungsweise davon abgeleitet ist und die zusätzlich die für einen Kunden spezifischen Eigenschaften und Methoden hinzufügt. Diese wollen wir schlicht Kunde nennen. Das Gleiche erledigen wir für die spezielle Ausprägung einer Person namens Mitarbeiter – wir legen eine neue Klasse namens Mitarbeiter an, die von der Klasse Person erbt und ihre eigenen Eigenschaften und Methoden beisteuert.

Vererbung programmieren

Wir wollen uns an den Beispielfeldern der Tabellen aus dem obigen Datenbankbeispiel orientieren und entsprechende Klassen erstellen.

Wir benötigen also zunächst die Klasse Person, die wir wie folgt in der Datei Program.cs anlegen:

class Person {
     public string Vorname { get; set; }
     public string Nachname { get; set; }
}

Das ist die Kurzfassung, wenn Sie die Eigenschaften Vorname und Nachname nur lesen und schreiben möchten, aber kein weiterer Zugriff auf die Werte erforderlich ist. Wenn Sie beispielsweise in einer Eigenschaft namens Bezeichnung den Vornamen und den Nachnamen zusammengesetzt zurückgeben wollen, müssen Sie folgende Klassendefinition verwenden:

class Person {
     private string vorname;
     private string nachname;
     public string Vorname { 
         get {
             return vorname;     
         }
         set {
             vorname = value;
         } 
     }
     public string Nachname {
         get {
             return nachname;
         }
         set {
             nachname = value;
         }
     }
     public string Bezeichnung {
         get {
             return vorname + " " + nachname;
         }
     }
}

Hier gibt es also interne Variablen namens vorname und nachname, welche die über die Eigenschaften Vorname und Nachname übergebenen Daten speichern. Für beide Eigenschaften legen wir jeweils einen get– und einen set-Block an, der übergebene Werte in der entsprechenden Variablen speichert oder diesen wieder herausgibt. Die dritte Eigenschaft heißt Bezeichnung und soll eine aus den Inhalten von vorname und nachname zusammengesetzte Zeichenkette zurückliefern.

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins DATENBANKENTWICKLER:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar