Ist das alles Polymorphismus?
-
hehe schrieb:
Nur weil es Mathematiker so verwenden ist das damit ja noch nicht die gültige Definition für die Informatik. Aber in der Informatik wird sowas so gut wie nie so genau wie in der Mathematik definiert...
Daher: Lieber an den Dozenten/Lehrer wenden, damit "seine" Einstellung zu dem Thema nicht die eigene Note versaut.
cu André
-
hehe schrieb:
Konrad Rudolph schrieb:
Da es einfach keine entsprechende Definition gibt, kann man IMHO eine so technische Grenze nicht ziehen. Diese Schwammigkeit stammt zum Teil auch einfach daher, dass diese Begriffe von Mathematikern eingeführt worden sind und dort gibt es solche Grenzen einfach nicht. Laufzeit, Compilezeit, who cares? Für das Konzept Polymorphie ist das eine vollkommen irrelevante Unterscheidung. Polymorphie wird nämlich auch dort verwendet, wo es diese Grenzen gar nicht gibt (nämlich speziell beim Lamddakalkül).
Nur weil es Mathematiker so verwenden ist das damit ja noch nicht die gültige Definition für die Informatik. Aber in der Informatik wird sowas so gut wie nie so genau wie in der Mathematik definiert...
Nein, die haben schon informatisch gearbeitet. … darum ging es mir ja.
-
Also meinen Lehrer werde ich dazu ganz sicher nicht fragen. Das Problem ist einfach, er scheint selber nur das zu wissen, was er sich eben aus dem Buch zusammenliest.
Er ist ja sogar der Meinung, void main wäre richtig, bzw. es würde keinen Unterschied machen, ob void oder int nimmt, da man mit der main Funktion ja nichts zurückgeben würde.
Laut ISO ist es aber int main...
Meine Note mit C++ kann ich mir auch nicht mehr versauen, da wir in der 12. Klasse mit PHP weitermachen - was ich glücklicherweise vor C++ gelernt habe.Also soll ich das Überladen nun auch unter Polymorphie zählen?
Vielen Dank für eure Antworten,
Squall
-
Konrad Rudolph schrieb:
... Das einfachste Beispiel für Polymorphie ist wahrscheinlich Überladung ...
Hallo!
Könntest du eine Quelle angeben, in welcher überladene Funktionen mit Polymorphie in Verbindung gebracht werden? Die hier aufgeführten Argumente scheinen mir doch sehr vage.
Polymorphie ist ein völlig anderes Konzept als überladene Funktionen, und wird in der (mir bekannten) Literatur nirgends miteinander in Verbindung gebracht.
Gruß
-
Also bei Polymorphie spricht man nicht mehr von Überladen, sondern von Überschreiben. Und das ist rein Definitionstechnisch etwas anderes.
-
Quellcode schrieb:
Also bei Polymorphie spricht man nicht mehr von Überladen, sondern von Überschreiben. Und das ist rein Definitionstechnisch etwas anderes.
Überschrieben werden virtuelle Funktionen. Aber wo bitte steht geschrieben, dass polymorphe Funktionen virtuell sein müssen?
'polymorph' ist primär ein Attribut des Verhaltens, nicht der Auswahl. Oder dass eine polymorphe Methode (Designphase) durch eine einzelne Funktion (Implementationsphase) repräsentiert werden muss. Ich denke, bei dieser Diskussion wird zu oft das Mittel mit dem Zweck verwechselt.
-
Polymorphie bedeutet nur: wenn ich dem Objekt eine Nachricht schicke, reagieren unterschiedliche Objekte auf diese Nachricht unterschiedlich.
Und das schliesst Ueberladung eben ein. Virtuelle Funktionen werden zB auch oft zur Compiletime statisch ausgewertet
-
Shade Of Mine schrieb:
Polymorphie bedeutet nur: wenn ich dem Objekt eine Nachricht schicke, reagieren unterschiedliche Objekte auf diese Nachricht unterschiedlich.
Lies das nochmal genau durch. Du schickst einem Objekt eine Nachricht und verschiedene (also mehrere) Objekte reagieren unterschiedlich???
http://en.wikipedia.org/wiki/Polymorphism
In general, polymorphism describes multiple possible states for a single property (it is said to be polymorphic, or polymorphous).
-
Netter trollversuch, aber das naechste mal bitte weiter denken
Drehen wir den Satz halt um:
Die selbe (single) Nachricht an unterschiedliche Objekte liefert unterschiedliches Verhalten.
-
auf: http://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
steht folgendes:
Overriding and Overloading
If a Dog is commanded to speak(), this may emit a Bark.
However, if a Pig is commanded to speak(), this may emit an Oink.
They both inherit speak() from Animal, but their derived class methods
override the methods of the parent class; this is Overriding Polymorphism.Overloading Polymorphism is the use of one method signature, or one operator
[...] to perform several different functions depending on the implementation.Frei übersetzt heißt das:
Überschreiben tritt auf, wenn gleiche Funktionen verschiedener Unterklassen
derselben Basisklasse existieren. Dabei wird die Methode der Basisklasse von
der Methode der Unterklasse überschrieben. (Overriding)Überladen tritt bei Verwendung einer Signatur oder eines Operators auf um
mehrere verschiedene Funktionen, abhängig von ihrer Implementierung,
durchzuführen.
-
Shade Of Mine schrieb:
Drehen wir den Satz halt um:
Die selbe (single) Nachricht an unterschiedliche Objekte liefert unterschiedliches Verhalten.Und was soll das sein, Nachrichtenpolymorphismus? Was für Nachrichten den überhaupt?
-
Komisch schrieb:
Was für Nachrichten den überhaupt?
sende einem objekt die nachricht "sprich!" und es wird je nachdem, was für ein objekt es ist, sprechen (oder nicht).
in C++ z.b. so:void foo (Animal& a) { a.speak(); }
aber dass das so aussieht, ist nur konvention.
ganz interessant wäre hier vielleicht, sich etwas mit objective-C auseinanderzusetzen.
-
queer_boy schrieb:
Komisch schrieb:
Was für Nachrichten den überhaupt?
sende einem objekt die nachricht "sprich!" und es wird je nachdem, was für ein objekt es ist, sprechen (oder nicht).
in C++ z.b. so:void foo (Animal& a) { a.speak(); }
aber dass das so aussieht, ist nur konvention.
OK, "Nachricht senden" soll also Methode aufrufen heißen. Es muss aber nicht ein anderes Objekt sein. In deinem Beispiel ist es sogar immer das selbe, nämlich Animal a. Dieses "Tier-Objekt" zeigt also polymorpes Verhalten (Overriding). Die Methode "speak" hat natürlich auch unterschiedliche Bedeutungen, entsprechend dem Kontext zu welchem Tier sie gehört, also ist die Bedeutung von "speak" polymorph (Overloading). Wobei ich finde, dass das Beispiel "Tier-sprich" nicht wirklich gut ist, bei sprechenden Tieren denkt man eigentlich an was anderes, im deutschen auf jeden Fall.
-
Shade Of Mine schrieb:
...Und das schliesst Ueberladung eben ein. ...
Polymorphie hat in der objektorientierten Programmierung eine bestimmte Bedeutung. Es geht dabei darum mit einer Variablen Objekte verschiedener Klassen halten zu können. (Siehe z.B. Informatik-Handbuch/Hanser-Verlag, Balzert/Softwaretechnik usw. ...)
In c++ ist das Konzept mit Pointern/Referenzen auf Basisklassen (späte Bindung mittels virtueller Methoden) umgesetzt und das war es dann auch schon.
Überladene Funktionen/Methoden haben mit der ganzen Sache nichts zu tun.
Ich bitte bei gegenteiligen Behauptungen auch um den entsprechenden Nachweis.
Man lässt sich ja gerne belehren, aber nur durch Fakten.
-
ein bisschen eigeninitiative schadet nie.
erstes ergebnis einer goolge-suche mit den stichtworten "C++ polymorphism overloading":http://www.exforsys.com/tutorials/c-plus-plus/polymorphism-an-introduction.html
/edit: falls du dieser quelle nicht glaubst, dann vielleicht dieser:
http://en.wikipedia.org/wiki/C%2B%2B#Polymorphism
-
vic1986 schrieb:
Polymorphie hat in der objektorientierten Programmierung eine bestimmte Bedeutung.
C++ ist aber eine Multiparadigmen Sprache - OOP ist nur ein Teil und Polymorphie gibt es eben auch ohne OOP zB in funktionalen Sprachen (und C++ bieten eben auch funktionale Elemente).
Manchmal ist die Welt mehr als Java
-
vic, Du solltest beachten, dass der Begriff Polymorphie in seiner Bedeutung ebenfalls überladen ist. Nur, weil er im Bereich der OOP eine Sonderbedeutung hat (und selbst dort wäre ich vorsichtig; auch in der OOP ist Überladung ein essenzielles Sprachmittel), heißt das noch lange nicht, dass Du auf andere Bereiche extrapolieren kannst.
-
Es gibt mehrere Definitionen zu Polymorphie. Ich vertrete auch eher die Ansicht von vic1986, aber wie schon erwähnt:
Es kommt nicht so sehr darauf an wie Polymorphie nun zu definieren ist (solange es keine Eindeutige Festlegung in der IT gibt sind mir die Argumente beider Seiten egal, solange es sich um Studenten oder Schüler handelt), es kommt nur darauf an das man in seinen Umfeld (falls relevant) einen einheitlichen Begriff findet, auch in Hinblick auf Klausuren und Abschlüsse. Da mögen die Meinungen noch so weit auseinander gehen (Selbst in der Fachliteratur), wenn der Dozent sagt dies ist Polymorphie, das aber nicht, dann soll er es so bekommen.
Auch wenn ich kein Fan von Gremien bin, sollte man irgendwann mal die IT-Begriffe so eindeutig formulieren das sie einigermaßen Resistenz vor unterschiedlichen Interpretationen sind.
Und wenn ich nur nach dem Begriff Vielgestaltig gehe, wäre für mein Verständnis Überladung keine Polymorphie, da der Aufruf dennoch statisch eindeutig aufgelöst wird (und daher auch meiner Meinung nach nicht vielgestaltig ist). Anders bei virtuellen Funktionen, die tatsächlich keine eindeutige Auflösung im Vorfeld erlauben (sondern erst zur Laufzeit).
Streitet ruhig weiter über die Definition, jede Seite hat Quellen genannt, jede Seite hat imho sinnvolle Argumente für ihren Standpunkt, gegen die Sturheit eines Dozenten oder Lehrers kommt ihr damit aber nicht an (Ich kenne wenige Lehrer die sich auf Diskussionen einlassen).
cu André
-
Um noch einmal auf etwas zurück zu kommen:
Komisch schrieb:
OK, "Nachricht senden" soll also Methode aufrufen heißen.
Grundlegend gibt es in einem objektorientierten System Objekte, die einen Zustand ein Verhalten haben. Schickt man einem Objekt eine Nachricht, so sorgt u.U. ein Verhalten des Objekts dafür, dass sein Zustand geändert wird.
Die Nachricht ist also der Zweck. Erst danach gehts um die Implementierung, die in den Sprachen, die ich kenne, durch Objektfunktionen bzw. Methoden erfolgt. Was aber nicht heißt, dass es nicht Sprachen gibt, die anders funktionieren.
Nachrichten zu versenden mit Methodenaufrufen gleichzusetzen hieße also, das Mittel zum Zweck zu erklären. Gerade deswegen kann man Polymorphie nicht rein auf virtuelle Methoden beziehen, sondern muss das Konzept abstrakter betrachten. Und gerade deswegen ist die genaue Eingrenzung so schwierig, da beim Weg vom Abstrakten zum Konkreten sehr viel reininterpretiert werden kann.
-
Ich möchte hier noch kurz auf eine Tatsache hinweisen, die im Eifer des Gefechts vollkommen untergegangen zu sein scheint:
Das Konzept der Polymorphie in der Informatik ist gut fünf Jahre älter als das der Vererbung! Eher sogar noch mehr. Die konkrete Unterteilung in Ad-hoch- und Typpolymorphie wurde 1967 von Christopher Strachey vorgenommen (wohlgemerkt, Polymorphie an sich war selbst da schon als informelles Konzept bekannt); Vererbung kam erst 1972, mit Smalltalk-72.
Übrigens wurde bei der Definition der Ad-hoc-Polymorphie explizit darauf Bezug genommen, dass dies dort der Fall ist, wo Operatoren in ihrer Bedeutung überladen sind. Ich zitiere mal aus [1], „We call ambiguous operators of this sort polymorphic as they have several forms depending on their arguments.“
[1] http://www.springerlink.com/content/x878vn91l4763752/
(Und ja, das Paper wurde 2000 publiziert, dass es älter ist, sieht man aber schon daran, dass der Autor 1975 gestorben ist.)