Vererbung - Fakultät für Wirtschaftswissenschaften

Download Report

Transcript Vererbung - Fakultät für Wirtschaftswissenschaften

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