Polymorphie: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(Die Seite wurde neu angelegt: „Kategorie:Informatik Kategorie:Informatik-Abitur =Erklärung= * Die Polymorphie ist in der Objektorientierten Programmierung eine Eigenschaft, die imm…“) |
|||
Zeile 12: | Zeile 12: | ||
* Bedeutung: Je nachdem, um was für ein Buch es sich handelt, wird die richtige Methode <code>info()</code> aufgerufen. | * Bedeutung: Je nachdem, um was für ein Buch es sich handelt, wird die richtige Methode <code>info()</code> aufgerufen. | ||
=Implementierung= | ==Implementierung== | ||
Die folgende Implementierung kann man in eine Klasse <code>BuecherVerwaltung</code> packen. Sie ist dann direkt lauffähig. | |||
'''Voraussetzung: Im selben Projekt muss die Klasse <code>List</code> zur Verfügung stehen!''' | |||
Die wichtigen Teile der Implementierung sind '''fett''' gedruckt. | |||
<code> | |||
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 | |||
<b>Buch aktuellesBuch = (Buch)buecherListe.getObject();</b> | |||
// Aufruf der <b>polymorphen</b> Methode | |||
String aktuelleInfo = <b>aktuellesBuch.info();</b> | |||
// 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; | |||
} | |||
<b>/** | |||
* hier kommt die polymorphe Methode! | |||
*/ | |||
public String info() { | |||
String ergebnis = "Autor: "+autor+"; Titel: "+titel; | |||
return ergebnis; | |||
}</b> | |||
} | |||
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; | |||
} | |||
<b>/** | |||
* 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; | |||
}</b> | |||
} | |||
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; | |||
} | |||
<b>/** | |||
* 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; | |||
}</b> | |||
} | |||
</code> | |||
==Ausgabe== | |||
Wenn man die Klasse startet, dann ergibt sich folgende Ausgabe: | |||
<code> | |||
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 | |||
</code> | |||
==Erläuterung== | |||
* Durch den Aufruf der <code>main</code>-Methode der Klasse <code>BuecherVerwaltung</code> wird die <code>buecherListe</code> gefüllt, und zwar mit: | |||
** ein Objekt vom Typ <code>Buch</code>: "Faust". | |||
** ein Objekt vom Typ <code>Fachbuch</code>: "Design Patterns". | |||
** ein Objekt vom Typ <code>Hoerbuch</code>: "Harry Potter 1". | |||
* Dann wird die Methode <code>alleInfosAusgeben()</code> der Klasse <code>BuecherVerwaltung</code> aufgerufen. Dort geschieht folgendes: | |||
** Die <code>buecherListe</code> wird durchlaufen. | |||
** Das aktuelle Buch wird ausgelesen und in der lokalen Variable <code>aktuellesBuch</code> gespeichert. Das ist auch für ein <code>Fachbuch</code> oder <code>Hoerbuch</code> möglich, weil diese von <code>Buch</code> erben! | |||
** Jetzt wird für <code>aktuellesBuch</code> die Methode <code>info()</code> aufgerufen und das Ergebnis in <code>aktuelleInfo</code> gespeichert. | |||
'''An dieser Stelle verhält sich die Methode <code>info()</code> polymorph: Je nachdem, ob es sich um ein <code>Buch</code>, <code>Fachbuch</code> oder <code>Hoerbuch</code> handelt, wird die Methode der entsprechenden Klasse aufgerufen!''' | |||
D.h. es werden folgende Methoden aufgerufen: | |||
* Zuerst die Methode <code>info()</code> der Klasse <code>Buch</code> (für das Buch "Faust") | |||
* Dann die Methode <code>info()</code> der Klasse <code>Fachbuch</code> (für das Buch "Design Patterns") | |||
* Schließlich die Methode <code>info()</code> der Klasse <code>Hoerbuch</code> (für das Buch "Harry Potter 1") |
Version vom 5. April 2013, 21:03 Uhr
Erklärung
- Die Polymorphie ist in der Objektorientierten Programmierung eine Eigenschaft, die immer im Zusammenhang mit Vererbungauftritt.
- Eine Methode ist polymorph, wenn sie in verschiedenen Klassen die gleiche Signatur hat, jedoch erneut implementiert ist.
Beispiel
- Fachbuch und Hoerbuch erben von Buch.
- 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")