Polymorphie
Erklärung
- Polymorphie ist in der Objektorientierten Programmierung eine Eigenschaft, die immer im Zusammenhang mit Vererbung auftritt.
- Eine Methode ist polymorph, wenn sie in verschiedenen Klassen die gleiche Signatur hat, jedoch erneut implementiert ist.
Beispiel
Fachbuch
undHoerbuch
erben vonBuch
.- Die Methode
info()
ist in allen drei Klassen enthalten. Diese Methode ist deswegen polymorph. - Bedeutung: Je nachdem, um was für ein Buch es sich handelt, wird die richtige Methode
info()
aufgerufen.
Implementierung
Die folgende Implementierung kann man in eine Klasse BuecherVerwaltung
packen. Sie ist dann direkt lauffähig.
Voraussetzung: Im selben Projekt muss die Klasse List
zur Verfügung stehen!
Die wichtigen Teile der Implementierung sind fett gedruckt.
public class BuecherVerwaltung {
private List buecherListe;
public BuecherVerwaltung(){
buecherListe = new List();
}
public void hinzufuegen(Buch pBuch){
buecherListe.append(pBuch);
}
public void alleInfosAusgeben(){
buecherListe.toFirst();
while(buecherListe.hasAccess()){
// auch Fachbuecher und Hoerbucher koennen so ausgelesen werden.
// denn sie sind Objekte vom Typ Buch
Buch aktuellesBuch = (Buch)buecherListe.getObject();
// Aufruf der polymorphen Methode
String aktuelleInfo = aktuellesBuch.info();
// Ausgabe an die Konsole
System.out.println(aktuelleInfo);
buecherListe.next();
}
}
public static void main(String[] args) {
BuecherVerwaltung bv = new BuecherVerwaltung();
Buch b = new Buch("Goethe", "Faust");
Fachbuch f = new Fachbuch("GangOfFour", "Design Patterns", "Software Engineering");
Hoerbuch h = new Hoerbuch("J.K. Rowling", "Harry Potter 1", 487, "Ben Kingsley");
bv.hinzufuegen(b);
bv.hinzufuegen(f);
bv.hinzufuegen(h);
bv.alleInfosAusgeben();
}
}
class Buch{
private String titel;
private String autor;
public Buch(String pAutor, String pTitel){
autor = pAutor;
titel = pTitel;
}
public String gibTitel(){
return titel;
}
public String gibAutor(){
return autor;
}
/**
* hier kommt die polymorphe Methode!
*/
public String info() {
String ergebnis = "Autor: "+autor+"; Titel: "+titel;
return ergebnis;
}
}
class Fachbuch extends Buch{
private String kategorie;
public Fachbuch(String pAutor, String pTitel, String pKategorie){
// den Konstruktor von Buch aufrufen!
super(pAutor, pTitel);
kategorie = pKategorie;
}
public String gibKategorie(){
return kategorie;
}
/**
* hier kommt die polymorphe Methode!
*/
public String info(){
// erst mal die info der Klasse Buch abfragen!
String ergebnis = super.info();
ergebnis += "; Kategorie: "+kategorie;
return ergebnis;
}
}
class Hoerbuch extends Buch{
private double dauer;
private String sprecher;
public Hoerbuch(String pAutor, String pTitel, double pDauer, String pSprecher){
// den Konstruktor von Buch aufrufen!
super(pAutor, pTitel);
dauer = pDauer;
sprecher = pSprecher;
}
public double gibDauer(){
return dauer;
}
public String gibSprecher(){
return sprecher;
}
/**
* hier kommt die polymorphe Methode!
*/
public String info(){
// erst mal die info der Klasse Buch abfragen!
String ergebnis = super.info();
ergebnis += "; Dauer: "+dauer+" Sprecher: "+sprecher;
return ergebnis;
}
}
Ausgabe
Wenn man die Klasse startet, dann ergibt sich folgende Ausgabe:
Autor: Goethe; Titel: Faust
Autor: GangOfFour; Titel: Design Patterns; Kategorie: Software Engineering
Autor: J.K. Rowling; Titel: Harry Potter 1; Dauer: 487.0 Sprecher: Ben Kingsley
Erläuterung
- Durch den Aufruf der
main
-Methode der KlasseBuecherVerwaltung
wird diebuecherListe
gefüllt, und zwar mit:- ein Objekt vom Typ
Buch
: "Faust". - ein Objekt vom Typ
Fachbuch
: "Design Patterns". - ein Objekt vom Typ
Hoerbuch
: "Harry Potter 1".
- ein Objekt vom Typ
- Dann wird die Methode
alleInfosAusgeben()
der KlasseBuecherVerwaltung
aufgerufen. Dort geschieht folgendes:- Die
buecherListe
wird durchlaufen. - Das aktuelle Buch wird ausgelesen und in der lokalen Variable
aktuellesBuch
gespeichert. Das ist auch für einFachbuch
oderHoerbuch
möglich, weil diese vonBuch
erben! - Jetzt wird für
aktuellesBuch
die Methodeinfo()
aufgerufen und das Ergebnis inaktuelleInfo
gespeichert.
- Die
An dieser Stelle verhält sich die Methode info()
polymorph: Je nachdem, ob es sich um ein Buch
, Fachbuch
oder Hoerbuch
handelt, wird die Methode der entsprechenden Klasse aufgerufen!
D.h. es werden folgende Methoden aufgerufen:
- Zuerst die Methode
info()
der KlasseBuch
(für das Buch "Faust") - Dann die Methode
info()
der KlasseFachbuch
(für das Buch "Design Patterns") - Schließlich die Methode
info()
der KlasseHoerbuch
(für das Buch "Harry Potter 1")