Polymorphie: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(11 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. | * 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. | ||
Zeile 9: | Zeile 18: | ||
[[File:Klassendiagramm-Buch-Fachbuch-Hoerbuch.png|thumb|Klassendiagramm |717px]] | [[File:Klassendiagramm-Buch-Fachbuch-Hoerbuch.png|thumb|Klassendiagramm |717px]] | ||
* <code>Fachbuch</code> und <code>Hoerbuch</code> erben von <code>Buch</code>. | * <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. | ||
Zeile 15: | Zeile 24: | ||
Die folgende Implementierung kann man in eine Klasse <code>BuecherVerwaltung</code> packen. Sie ist dann direkt lauffähig. | 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. | Die wichtigen Teile der Implementierung sind '''fett''' gedruckt. | ||
<code> | <code> | ||
public class BuecherVerwaltung { | public class BuecherVerwaltung { | ||
private List buecherListe; | private List<Buch> buecherListe; | ||
public BuecherVerwaltung(){ | public BuecherVerwaltung(){ | ||
buecherListe = new List(); | buecherListe = new List<>(); | ||
} | } | ||
Zeile 32: | Zeile 41: | ||
public void alleInfosAusgeben(){ | public void alleInfosAusgeben(){ | ||
buecherListe.toFirst(); | 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 = | <b>Buch aktuellesBuch = buecherListe.getContent();</b> | ||
// Aufruf der <b>polymorphen</b> Methode | // <u>Aufruf der <b>polymorphen</b> Methode</u> | ||
String aktuelleInfo = <b> | <u>String aktuelleInfo = aktuellesBuch.<b>info();</b></u> | ||
// Ausgabe an die Konsole | // Ausgabe an die Konsole | ||
System.out.println(aktuelleInfo); | System.out.println(aktuelleInfo); | ||
} | } | ||
} | } | ||
Zeile 57: | Zeile 65: | ||
bv.alleInfosAusgeben(); | bv.alleInfosAusgeben(); | ||
} | } | ||
} | } | ||
class Buch{ | class Buch{ | ||
private String titel; | private String titel; | ||
Zeile 85: | Zeile 92: | ||
}</b> | }</b> | ||
} | } | ||
class Fachbuch extends Buch{ | class Fachbuch '''extends Buch'''{ | ||
private String kategorie; | private String kategorie; | ||
Zeile 109: | Zeile 116: | ||
}</b> | }</b> | ||
} | } | ||
class Hoerbuch extends Buch{ | class Hoerbuch '''extends Buch'''{ | ||
private double dauer; | private double dauer; | ||
private String sprecher; | private String sprecher; | ||
Zeile 139: | Zeile 146: | ||
}</b> | }</b> | ||
} | } | ||
</code> | </code> | ||
==Ausgabe== | ==Ausgabe== | ||
Wenn man die Klasse startet, dann ergibt sich folgende Ausgabe: | Wenn man die Klasse startet, dann ergibt sich folgende Ausgabe: | ||
<code> | <code> | ||
Autor: Goethe; Titel: Faust | Autor: Goethe; Titel: Faust | ||
Autor: GangOfFour; Titel: Design Patterns; Kategorie: Software Engineering | Autor: GangOfFour; Titel: Design Patterns; Kategorie: Software Engineering | ||
Autor: J.K. Rowling; Titel: Harry Potter 1; Dauer: 487.0 Sprecher: Ben Kingsley | Autor: J.K. Rowling; Titel: Harry Potter 1; Dauer: 487.0 Sprecher: Ben Kingsley | ||
</code> | </code> | ||
==Erläuterung== | ==Erläuterung== | ||
Zeile 166: | Zeile 173: | ||
* Dann die Methode <code>info()</code> der Klasse <code>Fachbuch</code> (für das Buch "Design Patterns") | * 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") | * 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")