Home > Informatik > Informatik EF > Folge 6

Folge 6.3 - Polymorphie

In der Folge 6.2 haben wir die Gemeinsamkeiten der beiden Klassen Rectangle und Circle in eine gemeinsame Oberklasse Figure ausgelagert. Dieses Vorgehen entspricht dem Prinzip der Generalisierung.

Dann haben wir festgestellt, dass die leere paint()-Methode der Oberklasse von den Unterklassen zwar überschrieben werden kann, aber nicht unbedingt überschrieben werden muss. Daher haben wir die paint()-Methode als abstrakte Methode definiert. Abstrakte Methoden bestehen nur aus dem Kopf der Methode und einem abschließenden Semikolon:

 public abstract void paint(Graphics g);

Wenn eine Klasse eine abstrakte Methode enthält, müssen wir auch die gesamte Klasse als abstract kennzeichnen:

abstract class Figure
{
   // Instanzvariablen und Methoden ...
	
	public abstract void paint(Graphics g);
}

In dieser Teilfolge 6.3 wollen wir nun einen wichtigen Fachbegriff der OOP kennenlernen, nämlich den Begriff der Polymorphie. Wenn man in der Fachliteratur oder im Internet recherchiert oder eine KI befragt, erhält man meistens unterschiedliche, manchmal sogar sehr schwammige Definitionen dieses Begriffs. Am Besten macht man sich an einem konkreten Beispiel klar, was mit Polymorphie gemeint ist.

Ein erstes Beispiel für Polymorphie

import java.awt.*;

public class ShowPM
{
    Figure sonne, mond;
    Figure haus, kasten;
    
    public ShowPM()
    {
       sonne = new Circle(360,130,80);
       sonne.setFillColor(Color.YELLOW);
       sonne.setBorderColor(Color.RED);
       
       mond = new Circle(60,300,30);
       mond.setFillColor(new Color(127,127,0));
       mond.setBorderColor(Color.BLUE);    
       
       haus = new Rectangle(100,400,120,60);
       haus.setFillColor(new Color(45,78,92));
       
       kasten = new Rectangle(300,420,60,30);
       kasten.setFillColor(Color.RED);
    }
    
    public void paint(Graphics g)
    {
       sonne.paint(g);
       mond.paint(g);
       haus.paint(g);
       kasten.paint(g);
    }
}

Diese Klasse wird in der paintComponent()-Methode der Klasse Zeichenfenster folgendermaßen aufgerufen:

    protected void paintComponent(Graphics g)
    {
        super.paintComponent(g);
 
        ShowPM scene = new ShowPM();
        scene.paint(g);
    }

In der Klasse ShowPM fällt etwas Interessantes auf. Alle vier Instanzvariablen sonne, mond, haus und kasten besitzen einerseits den Typ Figure, also den Typ der abstrakten Oberklasse.

    Figure sonne, mond;
    Figure haus, kasten;

Andererseits verweisen die Variablen auf Objekte unterschiedlicher Unterklassen: sonne und mond verweisen auf Circle-Objekte, haus und kasten dagegen auf Rectangle-Objekte.

Noch einmal übersichtlich:

  • sonne, mond: Datentyp Figure, verweisen auf Circle-Objekte.
  • haus, kasten: Datentyp Figure, verweisen auf Rectangle-Objekte.

Eine Variable vom Typ der Oberklasse kann also offensichtlich auf Objekte verschiedener Unterklassen verweisen.

Schauen wir uns nun die Aufrufe der paint()-Methoden an.

    public void paint(Graphics g)
    {
       sonne.paint(g);
       mond.paint(g);
       haus.paint(g);
       kasten.paint(g);
    }

Obwohl alle Variablen den gleichen Typ Figure besitzen, rufen sonne und mond die paint()-Methode der Klasse Circle auf, während haus und kasten die entsprechende Methode der Klasse Rectangle ausführen.

Dieses Verhalten bezeichnet man als Polymorphie. Im weiteren Verlauf dieses Kurses werden wir sehen, dass sich damit Programme deutlich einfacher erweitern und verwalten lassen.

Definitionen des Begriffs Polymorphie

Dieser Abschnitt ist nur für Experten und Expertinnen gedacht, sie sich schon einmal etwas näher mit dem Begriff der Polymorphie auseinander setzen wollen.

Ich habe ChatGPT den Auftrag gegeben: "Suche mir verschiedene Definitionen des Begriffs Polymorphie aus der Fachliteratur heraus - möglichst unterschiedliche." Hier das Ergebnis dieser KI-gestützten Recherche:

Expertenwissen: Was bedeutet Polymorphie?

Von ChatGPT zusammengetragen

In der Fachliteratur wird der Begriff Polymorphie unterschiedlich beschrieben. Die folgenden Definitionen meinen jedoch alle dasselbe Grundprinzip:

  • Vielgestaltigkeit: Polymorphie bedeutet wörtlich "Vielgestaltigkeit". Verschiedene Objekte können auf denselben Methodenaufruf unterschiedlich reagieren.
  • Gemeinsame Schnittstelle: Mehrere unterschiedliche Klassen besitzen Methoden mit demselben Methodenkopf. Welche Methode tatsächlich ausgeführt wird, entscheidet sich erst zur Laufzeit.
  • Objekte verschiedener Unterklassen: Eine Variable vom Typ einer Oberklasse kann auf Objekte verschiedener Unterklassen verweisen. Beim Methodenaufruf wird automatisch die passende Implementierung der jeweiligen Unterklasse verwendet.
  • Einheitliche Programmierung: Programme können mit Objekten unterschiedlicher Klassen arbeiten, ohne deren konkrete Klasse kennen zu müssen.

Quellen (Auswahl): Bertrand Meyer: Objektorientierte Softwareentwicklung; Rheinwerk Verlag: Objektorientierte Programmierung; Duden Informatik; Wikipedia "Objektorientierung" und "Polymorphie (Programmierung)".

ChatGPT hat dann noch eine eigene Definition vorgeschlagen, die besser zum Niveau dieses Kurses passt:

Polymorphie

Polymorphie bedeutet, dass verschiedene Objekte auf denselben Methodenaufruf unterschiedlich reagieren können. Welche Methode tatsächlich ausgeführt wird, hängt vom Typ des jeweiligen Objekts ab.

Wenn also sonne.paint() aufgerufen wird, wird ein Kreis gezeichnet, weil die Methode Circle.paint() ausgeführt wird. Wird dagegen haus.paint() aufgerufen, wird ein Rechteck gezeichnet. Hier wird dann die Methode Rectangle.paint() ausgeführt.