In der objektorientierten Programmierung arbeitet man mit zwei Formen der Polymorphie,
dem ¨Uberschreiben und dem ¨Uberladen von Methoden.
Zu meiner Zeit galt das Überschreiben von Funktionen als Polymorphie nicht aber das Überladen von Funktionen. Ich denke aber das hängt von der Programmiersprache ab. Welche verwendet ihr? Zufällig C++? Dort ist es möglich die normalen Rechenoperationen zu überladen. Dann wäre es Polymorphie. Spielt jetzt aber erstmal keine Rolle.
A a = new A();
a.print();
Auf das Fett gedruckte kommt es an. Dessen Print methode wird aufgerufen.
Genau das ist Polymorphie. Ich speichere in Klasse A ein Objekt der Klasse C. Das geht nur wenn C eine abgeleitete Klasse von A ist. C a=new A(); würde nicht funktionieren.
Welche Art der Polymorphie wird hier angewendet?
Es handelt sich um klassisches Überschreiben von Funktionen.
Gegeben sei eine Klasse F mit den nachstehenden Methoden
• void print (int i) {...}
• void print (float f) {...}
• void print (int i, float f) {...}
F¨uhrt die Deklaration der gleichnamigen Methoden print(...) zu einem Fehler?
Begr¨unden Sie Ihre Aussage.
Solange die Funktionen anhand der Übergabeparameter eindeutig identifizierbar sind, gibt es keine Fehler. vod print(int a, float b) wäre nicht möglich. void print(string a, float b) dagegen schon. Die 1. Funktion hat die gleichen Übergabeparameter und den gleichen Namen einer bereits bestehenden Funktion -> keine eindeutige Identifizierung möglich. Die 2. Funktion hat dagegen zwar die gleiche Anzahl an Parametern und auch den gleichen Namen aber die Datentypen der Parameter unterscheiden sich. Das reicht bereits aus um sie zu unterscheiden. Allerdings kann es zu Problemen beim Aufruf kommen. In dem Beispiel zwar nicht aber bei Datentypen die dicht beieinander liegen wirds schwierig bzw meckert in einigen Fällen der Kompiler. Versuch mal Byte und Int auseinanderzuhalten wenn einfach nur eine 5 übergeben wird...
Edit: Ich glaube ich muss mich korrigieren. Es ist sowieso von Programmiersprache zu Programmiersprache unterschiedlich. Einige Kompiler interessieren sich nicht für die Datentypen der Übergabeparameter sondern nur für die Anzahl. Dann wären Funktion 1 und 2 nicht möglich weil es bereits eine Funktion mit 2 Parametern gibt. Ganz sicher bin ich mir da jetzt aber nicht. Müsste man mal ausprobieren.
Noch irgendwelche Fragen? Ich kann für Polymorphie auch eine ausführliche Erklärung aufschreiben. Ich bin nur im Moment noch auf Arbeit also psst. Nur Funktionen überschreiben und vererben ist zwar voraussetzung für Polymorphie aber führt nicht zwingend zu Polymorphie. Es gibt noch ein paar andere Bedingungen.
Nochmal zum Überladen von Funktionen. Ich nehm mal die oben stehenden Print Methoden als Beispiel. Was habe ich jetzt davon, dass ich 3 Print Methoden habe? Polymorphie bedeutet, dass erst zur Laufzeit feststeht welche Methode verwendet wird abhängig von dem Obejekt was gerade in der Variablen gespeichert wird. Wir haben oben ja 2 Variablen beide vom Type A gehabt aber einmal war das Obejekt C drin abgespeichert. 2 gleiche Variablen vom gleichen Typ und doch werden zur Laufzeit 2 verschiedene Printmehtoden aufgerufen. Überladenene Funktionen können das so nicht. Es gibt aber eine Außnahme. Einige wenige Programmiersprachen können zum Beispiel den Vergleichsoperator = überladen. Damit hat man dann quasie den normalen Vergleichsoperator überschrieben und somit wieder für Polymorphie gesorgt.
Letztes Edit: Weiß nicht wie ich das halbwegs verstänlich ausdrücken soll. Ohne Überschreiben ist kein Polymorphie möglich. Überladen von Funktionen ist nur dann Polymorphie wenn auch gleichzeitig irgendwas überschrieben wird. Überladen ohne Überschreiben ist kein Polymorphie. Damit stimmt die Aussage der Aufgabenstellung nicht.
Jetzt aber wirklich letztes Edit dafür aber Fett:Laut Wiki ist das Überladen von Funktionen kein Polymorphie. http://de.wikipedia.org/wiki/Polymorphie_(Programmierung) Nur das Überladen von Operatoren ist Polymorphie wegen dem gleichzeitigen Überschreiben des Operators. Damit ist der 2. Teil der Aufgabenstellung teilweise Falsch. Eventuell ist das aber beabsichtigt. Wer den Fehler findet bekommt Zusatzpunkte oder so. Ich kenn deinen Lehrer nicht. Das musst du wissen.