2.13 Vererbung Klassen modellieren Objekte der realen Welt. Diese sind oft hierarchisch gegliedert. Beispiel: Ein Verlag bietet Bücher und CDs an. Beide Medien sind Artikel des Verlages. Book author: String year: int Article code: int price: int label: String getarticleline() CD artist: String song: String[] Die Klasse Article enthält die gemeinsamen Felder code, price, label sowie einen Konstruktor und zwei weitere Methoden. getarticleline() stellt eine Artikelzeile auf code, price, label für die Anzeige im Warenkorb zusammen. zeigt ausführliche Informationen über den Artikel an. Java erlaubt mit dem Vererbungsprinzip die Bildung hierarchischer Klassenstrukturen mit denen Varianten von Objekten gleichbehandelt werden können. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 272
Implementierung von Article, Book und CD in Java class Article { int code, price; String label; Article(int code, String label, int price) {... } void {... } void getarticleline() {... } } class Book extends Article { /* Book ist ein Spezialfall von Article */ String author; int year; void {... } } class CD extends Article { /* CD ist ein Spezialfall von Article */ string artist; String[] song; void {... } } Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 273
Oberklasse und Unterklasse Book author: String year: int Article code: int price: int label: String getarticleline() CD artist: String song: String[] Book (bzw. CD) ist eine Erweiterung von Article. Wir sagen auch: Book (bzw. CD) ist von Article abgeleitet. Book (bzw. CD) erbt alle Felder und Methoden von Article als ob sie in Book (bzw. CD) selbst deklariert worden wären. So hat z.b. jedes Book- Objekt (bzw. CD-Objekt) ein Feld price und eine Methode getarticleline(). Article ist die Oberklasse von Book (bzw. CD), und Book, CD sind Unterklassen von Article. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 274
Hierarchische Gliederung und Überschreiben von Methoden Article code: int price: int label: String getarticleline() Unterklassen können weiter hierarchisch untergliedert werden: class Hardcover extends Book {... } class Softcover extends Book {... } Book author: String year: int Hardcover Softcover CD artist: String song: String[] Ist eine Klasse nicht explizit von einer anderen abgeleitet, so wird sie als Unterklasse einer vordefinierten Klasse Object betrachtet. Unterklassen können Methoden ihrer Oberklasse überschreiben. Z.B. überschreibt die Klasse Book (bzw. CD) die Methode von Article. Im Beispiel gibt es fünf Methoden, die sich alle unterscheiden können. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 275
super-aufrufe Article code: int price: int label: String getarticleline() Mit dem Schlüsselwort super kann man auf die Oberklasse zugreifen. So kann z.b. ein Book-Objekt die - Methode von Article mit super. Book author: String year: int CD artist: String song: String[] aufrufen. Der Konstruktor Article(int code, String label, int price) {} der Oberklasse Article kann z.b. mit super(code,author+title,price); Hardcover Softcover aufgerufen werden. Der Aufruf des Kontruktors der Oberklasse muss die erste Anweisung im Konstruktor der Unterklasse sein. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 276
Warum Vererbung? Jedes Programm, das in der Lage ist, mit Objekten der Oberklasse zu arbeiten, kann automatisch auch mit Objekten der Unterklasse arbeiten. Im Beispiel des Verlagshauses: Gibt es bereits ein Programm, das Artikel in den Warenkorb legen kann, den Warenkorb ausdrucken kann, Artikel im Warenkorb anzeigen kann, etc. so kann dieses Programm automatisch Bücher (CDs) in den Warenkorb legen, den Warenkorb ausdrucken, Bücher (CDs) im Warenkorb anzeigen, etc. Jedes Objekt der Unterklasse ist auch ein Objekt der Oberklasse. Die Umkehrung gilt jedoch nicht. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 277
Kompatibilität zwischen Ober- und Unterklasse Man kann ein Objekt der Unterklasse auch einer Variablen der Oberklasse zuweisen: Article a = new Book(); a zeigt jetzt auf ein Book-Objekt. Da a Variable der Klasse Article ist, können über a nur die Felder der Klasse Article angesprochen werden. Mit if (a instanceof Book)... können wir prüfen, ob a auf ein Book-Objekt zeigt. In diesem Fall können wir den Typ von a nach Book umwandeln: Book b = (Book) a; Zeigt a bei der Umwandlung nicht auf ein Book-Objekt, bricht das Programm mit einem Laufzeitfehler ab. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 278
Dynamische Bindung Article a = new Book(); Frage: Was geschieht bei einem Aufruf a.;? Dynamische Bindung: Eine Nachricht var.m() führt immer zum Aufruf der Methode m(), die zum dynamischen Typ von var gehört. Article a = new Book();... a.; /* von Book */... a = new CD();... a.; /* von CD */ Im Programmfragment links werden zwei unterschiedliche Methoden aufgerufen: Zuerst das der Klasse Book, dann das der Klasse CD. Universität Paderborn Technische Informatik für Ingenieure (TIFI) WS 09/10 279