Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Polymorphismus
1. Definition
Wir beginnen mit einem einfachen Beispiel, in dem wir zu einer Oberklasse (Tier) zwei Unterklassen (Katze, Hund) bilden:
Einer Variablen vom Typ Tier können wir sowohl Hund-Objekte als auch Katze-Objekte zuordnen. In beiden Fällen können wir die Methode stellDichVor() der Klasse Tier aufrufen:
Tier t; t = new Katze("Snoopy"); t.stellDichVor(); t.schnurre(); // GEHT NICHT! t = new Hund("Bello"); t.stellDichVor(); t.belle(); // GEHT NICHT!
Obwohl die Variable t zum Zeitpunkt des Aufrufes t.schnurre() auf ein Katze-Objekt zeigt, akzeptiert der Compiler diesen Aufruf nicht, denn die Deklaration Tier t in der ersten Zeile sichert nur zu, dass t auf ein Objekt der Klasse Tier oder einer Unterklasse davon zeigt.
2. Casten
Wir erweitern die Klasse Katze um eine Methode miaue und die Klasse Hund um eine Methode belle:
Können wir diese Methoden mit Hilfe der Variable t aufrufen?
Tier t; t = new Katze("Snoopy"); t.miaue(); // GEHT NICHT! t = new Hund("Bello"); t.belle(); // GEHT NICHT!
Obwohl die Variable t zum Zeitpunkt des Aufrufes t.schnurre() auf ein Katze-Objekt zeigt, akzeptiert der Compiler diesen Aufruf nicht, denn die Deklaration Tier t in der ersten Zeile sichert nur zu, dass t auf ein Objekt der Klasse Tier oder einer Unterklasse davon zeigt.
casten:
Aber wir wissen doch, dass beide Aufrufe in Ordnung sind. Können wir das dem Compiler nicht mitteilen?
Tier t; t = new Katze("Snoopy"); ((Katze)t).miaue(); // OK! t = new Hund("Bello"); ((Hund)t).belle(); // OK! ((Katze)t).miaue(); // Führt zur Laufzeit zu einem Fehler!
