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…“) |
|||
(14 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Kategorie:Informatik]] | [[Kategorie:Informatik]] | ||
[[Kategorie:Informatik-Abitur]] | [[Kategorie:Informatik-Abitur]] | ||
=Erklärvideos= | |||
* [https://youtu.be/OhZqyzWyDZg Vererbung und Polymorphie am Beispiel Buch - Fachbuch - Hörbuch] | |||
* [https://youtu.be/sErk4EfiUqM Vererbung und Polymorphie anhand einer LK-Klausuraufgabe (Quizfrage)] | |||
=Fachbegriffe= | |||
erben, Vererbung, ist-ein-Beziehung, polymorphe Methode | |||
=Erklärung= | =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. | * Eine Methode ist '''polymorph''', wenn sie in verschiedenen Klassen die gleiche Signatur hat, jedoch erneut implementiert ist. | ||
=Beispiel= | =Beispiel= | ||
[[File:Klassendiagramm-Buch-Fachbuch-Hoerbuch.png|thumb|Klassendiagramm |717px]] | [[File:Klassendiagramm-Buch-Fachbuch-Hoerbuch.png|thumb|Klassendiagramm |717px]] | ||
* Fachbuch und Hoerbuch erben von Buch. | * <code>Fachbuch</code> und <code>Hoerbuch</code> erben von <code>Buch</code>. | ||
* Die Methode <code>info()</code> ist in allen drei Klassen enthalten. Diese Methode ist deswegen '''polymorph'''. | * Die Methode '''<code>info()</code>''' 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 <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<Buch> buecherListe; | |||
public BuecherVerwaltung(){ | |||
buecherListe = new List<>(); | |||
} | |||
public void hinzufuegen(Buch pBuch){ | |||
buecherListe.append(pBuch); | |||
} | |||
public void alleInfosAusgeben(){ | |||
for(buecherListe.toFirst(); buecherListe.hasAccess(); buecherListe.next()){ | |||
// Auch Fachbuecher und Hoerbucher koennen so in die lokale Variable aktuellesBuch ausgelesen werden. | |||
// Denn sie sind Objekte vom Typ Buch, weil sie Subklassen von Buch sind. | |||
<b>Buch aktuellesBuch = buecherListe.getContent();</b> | |||
// <u>Aufruf der <b>polymorphen</b> Methode</u> | |||
<u>String aktuelleInfo = aktuellesBuch.<b>info();</b></u> | |||
// Ausgabe an die Konsole | |||
System.out.println(aktuelleInfo); | |||
} | |||
} | |||
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") | |||
=Vergleiche auch...= | |||
* [[Vererbung]] | |||
* [[abstrakte Klasse]] | |||
* [[Interface]] |
Aktuelle Version vom 24. Oktober 2022, 20:58 Uhr
Erklärvideos
- Vererbung und Polymorphie am Beispiel Buch - Fachbuch - Hörbuch
- Vererbung und Polymorphie anhand einer LK-Klausuraufgabe (Quizfrage)
Fachbegriffe
erben, Vererbung, ist-ein-Beziehung, polymorphe Methode
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<Buch> buecherListe;
public BuecherVerwaltung(){
buecherListe = new List<>();
}
public void hinzufuegen(Buch pBuch){
buecherListe.append(pBuch);
}
public void alleInfosAusgeben(){
for(buecherListe.toFirst(); buecherListe.hasAccess(); buecherListe.next()){
// Auch Fachbuecher und Hoerbucher koennen so in die lokale Variable aktuellesBuch ausgelesen werden.
// Denn sie sind Objekte vom Typ Buch, weil sie Subklassen von Buch sind.
Buch aktuellesBuch = buecherListe.getContent();
// Aufruf der polymorphen Methode
String aktuelleInfo = aktuellesBuch.info();
// Ausgabe an die Konsole
System.out.println(aktuelleInfo);
}
}
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")