Vererbung Folie 1Uwe Lämmel
Einführung in die ProgrammierungVererbung
Uwe Lämmel
Fakultät für Wirtschaftswissenschaften
www.wi.hs-wismar.de/~laemmel
Vererbung Folie 2Uwe Lämmel
Inhalt
Vererbung Subtype Ersetzung Polymorphie
Vererbung Folie 3Uwe Lämmel
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
Vererbung Folie 4Uwe Lämmel
DoME-Objekte
Vererbung Folie 5Uwe Lämmel
DoME-Klassen
Obere Hälfte:Merkmale
Unterer Teil:Methoden
Vererbung Folie 6Uwe Lämmel
Klassendiagramm
Vererbung Folie 7Uwe Lämmel
Das DoME-Objekt-Modell
Vererbung Folie 8Uwe Lämmel
CD Quelltextpublic 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
Vererbung Folie 9Uwe Lämmel
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
Vererbung Folie 10Uwe Lämmel
Datenbank-Quelltextclass 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
Vererbung Folie 11Uwe Lämmel
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 Folie 12Uwe Lämmel
Vererbung
Vererbung Folie 13Uwe Lämmel
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 Folie 14Uwe Lämmel
Vererbung in Java
class Medium{ ...}
class CD extends Medium { ...}
class DVD extends Medium{ ...}
keine Änderung
Änderung
Vererbung Folie 15Uwe Lämmel
Oberklasse
class Medium {
private String titel; private int spielzeit; private boolean habIch; private String kommentar;
// Konstruktoren und Methoden folgen …} // Medium
Vererbung Folie 16Uwe Lämmel
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
Vererbung Folie 17Uwe Lämmel
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
Vererbung und Konstruktoren
Vererbung Folie 18Uwe Lämmel
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
Vererbung Folie 19Uwe Lämmel
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.
Vererbung Folie 20Uwe Lämmel
Weitere Medien
Vererbung Folie 21Uwe Lämmel
mehr Hierarchie
Vererbung Folie 22Uwe Lämmel
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
neuer Datenbank-Code
Vererbung Folie 23Uwe Lämmel
/** * 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
neuer Datenbank-Code
Vererbung Folie 24Uwe Lämmel
Subklassen und Subtyp
Klassen (Bauplan-) definieren Typen
Subklassen definieren Subtypen.
Objekte der Subklassen benutzbar,wann immer ein Objekt der Oberklasse erforderlich (substitution )
Vererbung Folie 25Uwe Lämmel
Subtypen und Parameter-Übergabe
class Database {
public void erfasseMedium(Medium medium) { ... }} //Database
DVD dvd = new DVD(...);CD cd = new CD(...);
database. erfasseMedium(dvd);database. erfasseMedium(cd);
Subklassen-Objekte als Superklassen-Parameter
Vererbung Folie 26Uwe Lämmel
Klassendiagramm
Vererbung Folie 27Uwe Lämmel
Objekt – Diagramm
Vererbung Folie 28Uwe Lämmel
Polymorphe Variablen
Objekt-Variablen in Java sind polymorph: können Objekte verschiedener Typen
speichern:– deklarierten Typ– beliebiger Subtyp
Vererbung Folie 29Uwe Lämmel
Subtypen und Zuweisung
Vehicle v1 = new Vehicle();Vehicle v2 = new Car();Vehicle v3 = new Bicycle();
Subklasse Objekt kann einer Superklassen-Variable zugewiesen werden
Vererbung Folie 30Uwe Lämmel
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
Vererbung Folie 31Uwe Lämmel
Die Klasse Objekt
Alle Klassen erben von Object
Vererbung Folie 32Uwe Lämmel
Klassendiagramm
Vererbung Folie 33Uwe Lämmel
Probleme mit der Ausgabe
CD: Rites I (49 min)*Jan GarbarekAnzahl Titel: 16Das Beste auf dem Saxophon
DVD: Hair (119 min) Milos Forman
Das Musical!
Titel: Rites I (49 min)* Das Beste auf dem SaxophonTitel: Hair (119 min)
Das Musical!
Was wir wollen:
Wir bekommen:
Vererbung Folie 34Uwe Lämmel
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
Vererbung Folie 35Uwe Lämmel
Lösung: Überschreiben
print in allen Klassen jede Unterklasse mit
eigener print Version: print in Unterklasse
überschreibt print der Oberklasse (Overriding)
print print
Vererbung Folie 36Uwe Lämmel
Ü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)
Vererbung Folie 37Uwe Lämmel
Methoden-Aufruf
Weder Vererbung noch Polymorphie
Vererbung Folie 38Uwe Lämmel
Methoden-Aufruf
Vererbung aber kein Überschreiben
Vererbung Folie 39Uwe Lämmel
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
Vererbung Folie 40Uwe Lämmel
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
Vererbung Folie 41Uwe Lämmel
UML-Diagramm
Person
namegetNname()
Franzose
Bayer
getGruss() setLieblingsbier()
lieblingsbier
Deutscher
getGruss()getGruss()
Vererbung Folie 42Uwe Lämmel
Dynamisches BindenPerson
name
getName()
Deutscher
Bayerlieblingsbier getName()getGruss()
getGruss()
setLieblingsbier()getGruss()
Vererbung Folie 43Uwe Lämmel
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).
Vererbung Folie 44Uwe Lämmel
Hierarchie in der Vererbung
Vererbung Folie 45Uwe Lämmel
Ende