Fakultät für Wirtschaftswissenschaften Einführung in die Programmierung Vererbung Uwe Lämmel www.wi.hs-wismar.de/~laemmel [email protected] Uwe Lämmel Vererbung Folie 1 Inhalt Uwe Lämmel Vererbung Subtype Ersetzung Polymorphie Vererbung Folie 2 Das Beispiel DoME "Database of Multimedia Entertainment" speichert Informationen über CDs und DVDs – CD: Titel, Künstler, Anzahl Titel, Spielzeit, hab-Ich, Kommentar – DVD: Titel, Regisseur, Spielzeit, hab-Ich, Kommentar ermöglicht: – Suche nach Informationen – Ausgabe von Informationen / Listen Uwe Lämmel Vererbung Folie 3 DoME-Objekte Uwe Lämmel Vererbung Folie 4 DoME-Klassen Obere Hälfte: Merkmale Unterer Teil: Methoden Uwe Lämmel Vererbung Folie 5 Klassendiagramm Uwe Lämmel Vererbung Folie 6 Das DoME-Objekt-Modell Uwe Lämmel Vererbung Folie 7 CD Quelltext public class CD { private String titel; private String kuenstler; private String kommentar; CD(String derTitel, String derKuenstler){ titel = derTitel; kuenstler = derKuenstler; kommentar = " "; } // Konstruktor void setKommentar(String kommentar) { ... } // setzeKommentar String getKommentar() { ... } void print(){ ... } ... } // CD Uwe Lämmel Vererbung Folie 8 DVD Quelltext public class DVD { private String titel; private String regisseur; private String kommentar; DVD(String derTitel, String derRegisseur { titel = derTitel; regisseur = derRegisseur; kommentar = " "; } // Konstruktor void setKommentar(String kommentar) { ... } String getKommentar( ) { ... } void print( ) { ... } ... } // DVD Uwe Lämmel Vererbung Folie 9 class Database { DatenbankQuelltext private ArrayList<CD> cds; private ArrayList<DVD> dvds; ... public void list() { LineIO io = new LineIO(); for(CD cd : cds) { cd.print(); io.writeln(); // empty line between items } // for cd for(DVD dvd : dvds) { dvd.print(); io.writeln(); // empty line between items } // for dvd } // list } // Database Uwe Lämmel Vererbung Folie 10 Kritik doppelter Quelltext – Klassen CD und DVD sind fast gleich – Wartung schwierig – Doppelarbeit – Gefahr von Fehlern in der Wartung Doppelter Code auch in der Datenbank-Klasse Uwe Lämmel Vererbung Folie 11 Vererbung Uwe Lämmel Vererbung Folie 12 Vererbung Definieren einer Oberklasse (superclass) : Medium Definieren von Unterklassen (subclass) für CD und DVD Oberklasse verwaltet gemeinsame Merkmale Unterklasse "erbt" (inherit) Merkmale der Oberklasse Unterklassen fügen eigene Merkmale hinzu Uwe Lämmel Vererbung Folie 13 Vererbung in Java class Medium{ ... } keine Änderung Änderung class CD extends Medium { ... } Uwe Lämmel class DVD extends Medium{ ... } Vererbung Folie 14 Oberklasse class Medium { private String titel; private int private boolean private String spielzeit; habIch; kommentar; // Konstruktoren und Methoden folgen … } // Medium Uwe Lämmel Vererbung Folie 15 Unterklassen class CD extends Medium { private String kuenstler; private int titelanzahl; // Konstruktoren und Methoden folgen ... } // CD class DVD extends Medium { private String regisseur; // Konstruktoren und Methoden folgen ... } // DVD Uwe Lämmel Vererbung Folie 16 Vererbung und Konstruktoren class Medium { private String titel; private int spielzeit; private boolean habIch; private String kommentar; /** * Initialisieren der Merkmale. */ public Medium(String derTitel, int zeit) { titel = derTitel; spielzeit = zeit; habIch = false; kommentar = ""; } // Konstruktor // Methoden … } // Medium Uwe Lämmel Vererbung Folie 17 Vererbung und Konstruktoren class CD extends Medium { private String kuenstler; private int titelanzahl; /** * Erzeugen einer CD */ public CD(String derTitel, String derKuenstler, int anzTitel, int zeit) { super(derTitel, zeit); kuenstler = derKuenstler; titelanzahl = anzTitel; } // Konstructor // methods omitted } // CD Uwe Lämmel Vererbung Folie 18 Konstruktor der Oberklasse Unterklassen-Konstruktor muss 'super' aufrufen falls nicht, fügt Compiler super() ein: – funktioniert nur, falls Oberklasse Konstruktor ohne Parameter besitzt! super muss erste Anweisung im Konstruktor sein. Uwe Lämmel Vererbung Folie 19 Weitere Medien Uwe Lämmel Vererbung Folie 20 mehr Hierarchie Uwe Lämmel Vererbung Folie 21 neuer Datenbank-Code class Databank { private ArrayList<Medium> medien; /** * Erzeuge eine leere Datenbank */ public Databank() { medien = new ArrayList<Medium>(); } // Konstruktor /** * Hinzufügen eines Mediums */ public void erfasseMedium(Medium dasMedium) { medien.add(dasMedium); } // Database ... } // Database Uwe Lämmel Vererbung Folie 22 neuer Datenbank-Code /** * Ausgabe alle CDs und DVDs * auf die Konsole */ public void auflisten() { LineIO io = new LineIO(); for(Medium medium : medien) { medium.print(); io.writeln(); } //for } //auflisten Uwe Lämmel Vererbung Folie 23 Subklassen und Subtyp Klassen (Bauplan-) definieren Typen Subklassen definieren Subtypen. Objekte der Subklassen benutzbar, wann immer ein Objekt der Oberklasse erforderlich (substitution ) Uwe Lämmel Vererbung Folie 24 Subtypen und Parameter-Übergabe class Database { public void erfasseMedium(Medium medium) { ... } } //Database DVD dvd = new DVD(...); CD cd = new CD(...); Subklassen-Objekte als Superklassen-Parameter database. erfasseMedium(dvd); database. erfasseMedium(cd); Uwe Lämmel Vererbung Folie 25 Klassendiagramm Uwe Lämmel Vererbung Folie 26 Objekt – Diagramm Uwe Lämmel Vererbung Folie 27 Polymorphe Variablen Objekt-Variablen in Java sind polymorph: können Objekte verschiedener Typen speichern: – deklarierten Typ – beliebiger Subtyp Uwe Lämmel Vererbung Folie 28 Subtypen und Zuweisung Subklasse Objekt kann einer Superklassen-Variable zugewiesen werden Vehicle v1 = new Vehicle(); Vehicle v2 = new Car(); Vehicle v3 = new Bicycle(); Uwe Lämmel Vererbung Folie 29 Casting (Typ-Angleichung) S.318 !! Subtyp kann Supertyp zugewiesen werden ABER: Supertyp kann NICHT Subtyp zugewiesen werden: Vechicle v; Car c = new Car(); v = c; // richtig; c = v; Compiler-Fehler! Casting = explizite Typumwandlung – ermöglicht Zuweisung an Subtyp. c = (Car) v; – Nur OK, falls v wirklich ein Auto! – Verantwortung liegt beim Programmierer Uwe Lämmel Vererbung Folie 30 Die Klasse Objekt Alle Klassen erben von Object Uwe Lämmel Vererbung Folie 31 Klassendiagramm Uwe Lämmel Vererbung Folie 32 Probleme mit der Ausgabe Was wir wollen: CD: Rites I (49 min)* Jan Garbarek Anzahl Titel: 16 Das Beste auf dem Saxophon DVD: Hair (119 min) Milos Forman Das Musical! Wir bekommen: Uwe Lämmel Titel: Rites I (49 min)* Das Beste auf dem Saxophon Titel: Hair (119 min) Das Musical! Vererbung Folie 33 Problem print-Methode der Klasse Medium listet nur gemeinsame Merkmale. Vererbung nur von oben nach unten – Subklasse erbt Oberklassen-Merkmale. – Oberklasse kennt nicht die Subklassen-Merkmale Uwe Lämmel Vererbung Folie 34 Lösung: Überschreiben print in allen Klassen jede Unterklasse mit eigener print Version: print in Unterklasse überschreibt print der Oberklasse (Overriding) print print Uwe Lämmel print Vererbung Folie 35 Überschreiben/Overriding Oberklasse und Unterklasse definieren Methoden mit derselben Signatur (Kopf) Jede Methode greift auf Merkmaler ihrer Klasse zu Methode in Oberklasse erfüllt statischen Typcheck Laufzeit: Unterklassen-Methode wird aktiviert (überschreibt Oberklassen-Version) Uwe Lämmel Vererbung Folie 36 Methoden-Aufruf Weder Vererbung noch Polymorphie Uwe Lämmel Vererbung Folie 37 Methoden-Aufruf Vererbung aber kein Überschreiben Uwe Lämmel Vererbung Folie 38 Methoden-Aufruf Zugriff auf Variable in Variable gespeichertes Objekt finden Klasse des Objekts finden Klasse wird nach Methode durchsucht Falls NICHT gefunden: Oberklasse durchsuchen wiederholen bis Methode gefunden Überschreibende Methoden werden zuerst gefunden Uwe Lämmel Vererbung Folie 39 Beispiel public class Person { private String name; public Person(String name) { this.name = name;} public String getName( ) { return name; } } //Person public class Deutscher extends Person { public Deutscher(String name) { super(name); } public String getGruss() { return "Guten Tag"; } } //Deutscher Uwe Lämmel Vererbung Folie 40 UML-Diagramm Person name getNname() Deutscher getGruss() Franzose getGruss() Bayer lieblingsbier getGruss() setLieblingsbier() Uwe Lämmel Vererbung Folie 41 Dynamisches Binden Person name getName() Deutscher getGruss() getGruss() Bayer lieblingsbier getName() getGruss() setLieblingsbier() Uwe Lämmel Vererbung Folie 42 Zusammenfassung Vererbung erlaubt Definition von Klassen als Erweiterung von Klassen Vererbung – vermeidet doppelten Code – ermöglicht Code-Wiederverwendung – vereinfacht den Quelltext – vereinfacht Wartung und Erweiterung Variablen können auch Subtypen-Objekte speichern Subtypen können überall dort eingesetzt werden, wo Supertyp erwartet (Substitution). Uwe Lämmel Vererbung Folie 43 Hierarchie in der Vererbung Uwe Lämmel Vererbung Folie 44 Ende Uwe Lämmel Vererbung Folie 45