Objektorientierte Programmierung / Polymorphie / ... wtf ?

SteveO

Enthusiast
Thread Starter
Mitglied seit
29.12.2004
Beiträge
8.750
Ort
Ilmcity
Hi
Kann mir jemand folgende Aufgabe erklären/lösen ?
Was ist da zu machen und um was geht es überhaupt ? :hmm:
In der objektorientierten Programmierung arbeitet man mit zwei Formen der Polymorphie,
dem ¨Uberschreiben und dem ¨Uberladen von Methoden.
Es sei die folgende Klassenhierarchie gegeben:
1. Klasse A
2. Subklassen der Klasse A
• Klasse B
• Klasse C
In jeder Klasse gibt es eine Methode print, die den Klassennamen ausgibt. Welche Ausgaben
erfolgen durch das nachstehende Programm:
A a = new A();
a.print();
B b = new B();
b.print();
a = b;
a.print();
A c = new C();
c.print();
Welche Art der Polymorphie wird hier angewendet?
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.
Vielen Dank schonmal !
Ste
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Im ersten Teil wird die print() Methode von den Subklassen überschrieben und im zweiten Teil (Klasse F) wir die print() Methode überladen, d.h. mit verschiedenen Parametern implementiert. Das führt in modernen OOP Sprachen nicht zu einem Fehler.
 
Polymorphie = Überladen und Überschreiben von Methoden.
Überschreiben:
Gegeben zwei Klassen Haus und Hochhaus. Hochhaus erbe von Haus. Haus besitze die Methode getTyp() die den Typ des Hauses ausgiebt (hier: "Haus"). Hochhaus erbt nun diese Methode. D.h. wenn du Hochhaus.getTyp() aufrufst wird die Methode getTyp() aus Haus aufgerufen. Der Rückgabewert wäre also "Haus". Da das nicht ganz zu einem Hochhaus passt, gibt es die Möglichkeit die Methode getTyp() aus Haus in Hochhaus mit einer gleichnamigen und gleichparametrigen Methode neu zudeklarieren. Die Methode in Hochhaus hat den gleichen Namen und die gleiche Parameteranzahl wie die Methode in Haus. Der Unterschied zur Methode getTyp() aus der Klasse Haus ist, dass die Methode nicht in Haus sondern in Hochhaus deklariert wurde. Die Methode aus getTyp() aus Haus wird also mit der Methode getType() aus Hochhaus überschrieben. Deshalb wird getTyp() auch "überschriebene" Methode genannt.

Überladen:
Überladen von Methoden findet innherhalb einer Klasse statt. Nehmen wir z.B. wieder die Klasse Haus. Klasse Haus habe nun auch die Methode getFensteranzahl(), die die Anzahl aller Fenster im Haus zurückgibt. Nun könnte der Nutzer nur an der Anzahl von Fenstern eines bestimmten Typs interresiert ist (z.B. Dachfenster oder normale Fenster). Mit der Methode getFensteranzahl() besteht allerdings keinerlei Unterscheidungsmöglichkeit zwischen Dachfenstern und normalen Fenstern. Es wird immer nur die Gesamtanzahl zurückgegeben. Diesen Umstand kann der Entwickler damit lösen, dass er eine weitere Methode getFensteranzahl(Typ) in Haus deklariert, die die Fensteranzahl zu einem bestimmten Typ zurückgibt. Wie du siehst heißen sowohl die "alte" Methode getFensteranzahl() wie auch die neue Methode getFensteranzahl(Typ) gleich. Der Unterschied ist die Paramateranzahl von 0 und 1. Die neue Methode getFensteranzahl(Typ) überlädt also die Methode getFensteranzahl(). D.h. getFensteranzahl ist eine "überladene" Methode. Wird z.B. getFensteranzahl() aufgrufen wird die "alte" Methode genutzt und die Gesamtzahl an Fenstern zurückgegeben. Wird Haus.getFensteranzahl("Dachfenster") aufgerufen wird die "neue" Methode genutzt und die Anzahl der Dachfenster zurückgegeben.

Ich denke mal das Ziel dieser Aufgabe war es dir zu zeigen wie Polymorphie funktioniert und wie Vererbung effiktiv genutzt werden kann.

A a = new A(); //Klar.
a.print(); // Methode print() der Klasse A --> "A"
B b = new B(); //Klar.
b.print(); // Methode print() der Klasse B --> "B"
a = b; // a ist vom Typ A, b ist vom Typ B, B erbt von A --> a kann eine Referenz auf eine Instanz von B enthalten --> a referneziert gleiche Instanz von Typ B wie b
a.print(); // a referenziert auf Instanz von Typ B --> B.print() --> "B"
A c = new C(); // c enthält Referenz auf Instanz von Typ C --> C.print() --> "C"

Angewandte Art der Polymorphie: Überschreiben

Edit:
Das ist kein Überladen sondern Überschreiben. Von Überladen redet man, wenn die Methode gleich heißt aber andere Parameter erwartet. Überschreiben ist nur beim Vererben möglich. Innerhalb einer Klasse wird er Kompiler meckern.

little_skunk hat Recht. Da habe ich wohl die Begriffe verwechselt. Beispiel angepasst.
 
Zuletzt bearbeitet:
Überladen:
...gleichnamigen und gleichparametrigen Methode neu zudeklarieren.

Das ist kein Überladen sondern Überschreiben. Von Überladen redet man, wenn die Methode gleich heißt aber andere Parameter erwartet.

Überschreiben:
Überschreiben von Methoden findet innherhalb einer Klasse statt.

Überschreiben ist nur beim Vererben möglich. Innerhalb einer Klasse wird er Kompiler meckern.
 
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.
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh