Polymorphie: Unterschied zwischen den Versionen

Aus SibiWiki
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

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