Polymorphie: Unterschied zwischen den Versionen

Aus SibiWiki
Zur Navigation springen Zur Suche springen
Zeile 29: Zeile 29:
<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 40: Zeile 40:
    
    
   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 ausgelesen werden.
         // Denn sie sind Objekte vom Typ Buch, weil sie Subklassen von Buch sind.
         // denn sie sind Objekte vom Typ Buch
         <b>Buch aktuellesBuch = buecherListe.getContent();</b>
         <b>Buch aktuellesBuch = (Buch)buecherListe.getObject();</b>
   
   
         // <u>Aufruf der <b>polymorphen</b> Methode</u>
         // <u>Aufruf der <b>polymorphen</b> Methode</u>
Zeile 51: Zeile 50:
         // Ausgabe an die Konsole
         // Ausgabe an die Konsole
         System.out.println(aktuelleInfo);
         System.out.println(aktuelleInfo);
        buecherListe.next();
       }
       }
   }
   }

Version vom 18. März 2021, 18:13 Uhr


Erklärvideo

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 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")