450 likes | 614 Views
Fakultät für Wirtschaftswissenschaften. Einführung in die Programmierung Vererbung. Uwe Lämmel. www.wi.hs-wismar.de/~laemmel Uwe.Laemmel@hs-wismar.de. Inhalt. Vererbung Subtype Ersetzung Polymorphie. Das Beispiel DoME. "Database of Multimedia Entertainment"
E N D
Fakultät für Wirtschaftswissenschaften Einführung in die ProgrammierungVererbung Uwe Lämmel www.wi.hs-wismar.de/~laemmel Uwe.Laemmel@hs-wismar.de
Inhalt • Vererbung • Subtype • Ersetzung • Polymorphie
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
DoME-Klassen Obere Hälfte:Merkmale Unterer Teil:Methoden
public class CD { privateString titel; privateString kuenstler; privateString kommentar; CD(String derTitel, String derKuenstler){ titel = derTitel; kuenstler = derKuenstler; kommentar = " "; } // Konstruktor void setKommentar(String kommentar) { ... } // setzeKommentar String getKommentar() { ... } void print(){ ... } ... } // CD CD Quelltext
DVD Quelltext public class DVD { privateString titel; private String regisseur; privateString kommentar; DVD(String derTitel, String derRegisseur { titel = derTitel; regisseur = derRegisseur; kommentar = " "; } // Konstruktor void setKommentar(String kommentar) { ... } String getKommentar( ) { ... } void print( ) { ... } ... } // DVD
class Database { 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 Datenbank-Quelltext
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
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
Vererbung in Java keine Änderung classMedium{ ... } Änderung classDVDextendsMedium{ ... } class CD extendsMedium { ... }
Oberklasse classMedium { privateStringtitel; privateint spielzeit; privateboolean habIch; privateString kommentar; //Konstruktoren und Methoden folgen … }// Medium
Unterklassen class CD extends Medium { privateString kuenstler; privateint titelanzahl; // Konstruktoren und Methoden folgen ... } // CD class DVD extends Medium { privateString regisseur; // Konstruktoren und Methoden folgen ... } // DVD
class Medium { privateString titel; privateint spielzeit; privateboolean habIch; privateString kommentar; /** * Initialisieren der Merkmale. */ public Medium(String derTitel, int zeit) { titel = derTitel; spielzeit = zeit; habIch = false; kommentar = ""; } // Konstruktor // Methoden … } // Medium Vererbung und Konstruktoren
Vererbung und Konstruktoren class CD extendsMedium { privateStringkuenstler; privateint titelanzahl; /** * Erzeugen einer CD */ public CD(StringderTitel, StringderKuenstler, intanzTitel, intzeit) { super(derTitel, zeit); kuenstler = derKuenstler; titelanzahl = anzTitel; }// Konstructor // methods omitted }// CD
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.
class Databank { private ArrayList<Medium>medien; /** * Erzeuge eine leere Datenbank */ public Databank() { medien = new ArrayList<Medium>(); } // Konstruktor /** * Hinzufügen eines Mediums */ public voiderfasseMedium(MediumdasMedium){ medien.add(dasMedium); }// Database ... } // Database neuer Datenbank-Code
neuer Datenbank-Code /** * Ausgabe alle CDs und DVDs * auf die Konsole */ public voidauflisten(){ LineIO io = new LineIO(); for(Medium medium : medien) { medium.print(); io.writeln(); }//for }//auflisten
Subklassen und Subtyp • Klassen (Bauplan-) definieren Typen • Subklassen definieren Subtypen. • Objekte der Subklassen benutzbar,wann immer ein Objekt der Oberklasse erforderlich (substitution)
Subtypen und Parameter-Übergabe class Database { publicvoid erfasseMedium(Medium medium) { ... } } //Database DVD dvd = new DVD(...); CD cd = new CD(...); database. erfasseMedium(dvd); database. erfasseMedium(cd); Subklassen-Objekte als Superklassen-Parameter
Polymorphe Variablen Objekt-Variablen in Java sind polymorph: • können Objekte verschiedener Typen speichern: • deklarierten Typ • beliebiger Subtyp
Subtypen und Zuweisung Subklasse Objekt kann einer Superklassen-Variable zugewiesen werden Vehicle v1 = new Vehicle(); Vehicle v2 = new Car(); Vehicle v3 = new Bicycle();
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
Die Klasse Objekt Alle Klassen erben von Object
Probleme mit der Ausgabe CD: Rites I (49 min)* Jan Garbarek Anzahl Titel: 16 Das Beste auf dem Saxophon DVD: Hair (119 min) Milos Forman Das Musical! Was wir wollen: Wir bekommen: Titel: Rites I (49 min)* Das Beste auf dem Saxophon Titel: Hair (119 min) Das Musical!
Problem • print-Methode der Klasse Mediumlistet nur gemeinsame Merkmale. • Vererbung nur von oben nach unten • Subklasse erbt Oberklassen-Merkmale. • Oberklasse kennt nicht die Subklassen-Merkmale
Lösung: Überschreiben • print in allen Klassen • jede Unterklasse mit eigener print Version: • print in Unterklasse überschreibt print der Oberklasse (Overriding) print print print
Ü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)
Methoden-Aufruf Weder Vererbung noch Polymorphie
Methoden-Aufruf Vererbung aber kein Überschreiben
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
Beispiel publicclass Person { private String name; public Person(String name) { this.name = name;} public String getName( ) { return name; } } //Person publicclass Deutscher extends Person { public Deutscher(String name) { super(name); } public String getGruss() { return"Guten Tag"; } } //Deutscher
Person name getNname() Deutscher Franzose getGruss() getGruss() Bayer lieblingsbier getGruss() setLieblingsbier() UML-Diagramm
Person name getName() Deutscher getGruss() Bayer getGruss() lieblingsbier getName() getGruss() setLieblingsbier() Dynamisches Binden
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).