Polymorphie: Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
 
(8 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=
=Fachbegriffe=
erben, Vererbung, ist-ein-Beziehung, polymorphe Methode
erben, Vererbung, ist-ein-Beziehung, polymorphe Methode


Zeile 24: Zeile 28:
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 37: Zeile 41:
    
    
   public void alleInfosAusgeben(){
   public void alleInfosAusgeben(){
       buecherListe.toFirst();
       for(buecherListe.toFirst(); buecherListe.hasAccess(); buecherListe.next()){
      while(buecherListe.hasAccess()){
         // auch Fachbuecher und Hoerbucher koennen so ausgelesen werden.
         // Auch Fachbuecher und Hoerbucher koennen so in die lokale Variable aktuellesBuch ausgelesen werden.
         // denn sie sind Objekte vom Typ Buch
         // Denn sie sind Objekte vom Typ Buch, weil sie Subklassen von Buch sind.
         <b>Buch aktuellesBuch = (Buch)buecherListe.getObject();</b>
         <b>Buch aktuellesBuch = buecherListe.getContent();</b>
   
   
         // <u>Aufruf der <b>polymorphen</b> Methode</u>
         // <u>Aufruf der <b>polymorphen</b> Methode</u>
         <u>String aktuelleInfo = <b>aktuellesBuch.info();</b></u>
         <u>String aktuelleInfo = aktuellesBuch.<b>info();</b></u>
   
   
         // Ausgabe an die Konsole
         // Ausgabe an die Konsole
         System.out.println(aktuelleInfo);
         System.out.println(aktuelleInfo);
        buecherListe.next();
       }
       }
   }
   }
Zeile 62: Zeile 65:
       bv.alleInfosAusgeben();
       bv.alleInfosAusgeben();
   }
   }
 
  }
  }
 
  class Buch{
  class Buch{
   private String titel;
   private String titel;
Zeile 90: Zeile 92:
   }</b>
   }</b>
  }
  }
 
  class Fachbuch extends Buch{
  class Fachbuch '''extends Buch'''{
   private String kategorie;
   private String kategorie;
    
    
Zeile 114: 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 144: 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 171: 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

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

Klassendiagramm
  • 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<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 Klasse BuecherVerwaltung wird die buecherListe 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".
  • Dann wird die Methode alleInfosAusgeben() der Klasse BuecherVerwaltung 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 ein Fachbuch oder Hoerbuch möglich, weil diese von Buch erben!
    • Jetzt wird für aktuellesBuch die Methode info() aufgerufen und das Ergebnis in aktuelleInfo gespeichert.

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 Klasse Buch (für das Buch "Faust")
  • Dann die Methode info() der Klasse Fachbuch (für das Buch "Design Patterns")
  • Schließlich die Methode info() der Klasse Hoerbuch (für das Buch "Harry Potter 1")

Vergleiche auch...