Definition: Polymorphie
-
Shade Of Mine schrieb:
Ich schicke eine Botschaft an einen Empfaenger und dieser reagiert unterschiedlich.
Ja, das Problem ist nur, dass Templates schon mal garnicht reagieren können. Und wenn du eine Botschaft z.B. "int" an irgend einen konkreten Interpreter sendest, der das Template interpretiert, dann wird der immer gleich reagieren. Wenn du eine zweite Botschaft an den gleichen Interpreter sendest, dann wird er auf diese auch immer gleich reagieren. Das Ergebnis kann anders sein, wenn die Botschaft eine andere war, dass ist aber nicht Polymorphie.
-
Die Definition
Gleiche Botschaft an verschiedene Objekte ergibt unterschiedliche Reaktion.
ist imho vollkommen zutreffend. Polymorphie fängt lange vor virtuellen Funktionen und Templates an. Allein überladene Funktionen sin polymorph. Aber sowas
a + b;
ist ebenfalls polymorph auch ohne überladene Operatoren oder selbst definierte Typen. Eine Additionsnachricht an eine int-Objekt ruft Ganzzahladdition auf. Diesselbe Nachricht an eine float-Objekt ruft Gleitkommazahladdition auf. Gleiche Nachricht => unterschiedliche Reaktion.
Gruß
Don06
-
Don06 schrieb:
Die Definition
Gleiche Botschaft [b][u]an verschiedene Objekte[/u][/b] ergibt unterschiedliche Reaktion.
ist imho vollkommen zutreffend.
Das ist normal. Für was soll das die Definition sein?
In der OOP ist es Polymorphie, wenn die Objekte von der gleichen Basisklasse abgeleitet sind und du die Methode der Basisklasse aufrufst. Du siehst also nur ein Objekt einer Basisklasse und dieses reagiert unterschiedlich.Don06 schrieb:
Aber sowas
a + b;
ist ebenfalls polymorph auch ohne überladene Operatoren oder selbst definierte Typen. Eine Additionsnachricht an eine int-Objekt ruft Ganzzahladdition auf. Diesselbe Nachricht an eine float-Objekt ruft Gleitkommazahladdition auf. Gleiche Nachricht => unterschiedliche Reaktion.
Du sendest die Additionsnachricht aber nicht an das "int-Objekt". Es gibt garkein "int-Objekt", wenn es ein Objekt wäre, dann wäre es auch wieder Operatorüberladung.
-
Klartext schrieb:
In der OOP ist es Polymorphie, wenn die Objekte von der gleichen Basisklasse abgeleitet sind und du die Methode der Basisklasse aufrufst. Du siehst also nur ein Objekt einer Basisklasse und dieses reagiert unterschiedlich.
Und deshalb kommen wir auf keinen gruenen Zweig - denn OOP ist einfach ein zu kleines Feld. Aus reiner OO Sicht hast du ja recht, aber Polymorphie ist nicht auf OOP limitiert.
Aber ich ziehe mich hiermit lieber zurueck. Ich empfehle an dieser Stelle nur mal andere Sprachen zu lernen um von der starren Java/C++ Sichtweise mal wegzukommen.
-
Klar gibt es mehr Polymorphie, als nur die OO Polym. Der + Operator kann auch polymorph sein, einmal ist es ne Addition und mal Texte zusammenfügen. Der Operator sieht immer gleich aus, aber seine Bedeutung ändert sich mit dem Kontext. Aber Templates machen halt keine OO Polym. Nur ob man es statische Polymorphie nennen soll? Irgendwie widerspricht sich das doch schon in sich. Statisch und polymorph? Ich find das passt nicht wirklich zusammen.
-
Klartext schrieb:
Klar gibt es mehr Polymorphie, als nur die OO Polym. Der + Operator kann auch polymorph sein, einmal ist es ne Addition und mal Texte zusammenfügen. Der Operator sieht immer gleich aus, aber seine Bedeutung ändert sich mit dem Kontext. Aber Templates machen halt keine OO Polym. Nur ob man es statische Polymorphie nennen soll? Irgendwie widerspricht sich das doch schon in sich. Statisch und polymorph? Ich find das passt nicht wirklich zusammen.
Nein, es widerspricht sich nicht. Der operator + ist polymorph, nur wird die polymorphie bereits zur Compilezeit wieder aufgelöst.
Der template-Code ist wie ein Bild, betrachtet man einzelne Abschnitte mit einer Lupe ist meist nurnoch erahnbar, was die Stelle darstellen soll. Wenn man das umliegende Bild ändert, kann es wieder was völlig anderes sein. Erst wenn man das Bild im ganzen betrachtet, kann man sich sicher sein, was es ist(und manchmal nichtmal dann, aber das ist ein anderes thema :D).
Das Auflösen der Polymorphie kann aber auch kein bewertungskriterium sein. Selbst dynamische Polymorphie lässt sich mittels Laufzeitinformationen von einem interpreter unter umständen auflösen. Zum Beispiel wenn ein Objekt einmal am Anfang des Programms erstellt wird, der typ aber von externen daten abhängt.
Wenn sich der Objekttyp nicht ändert, also das Objekt nicht ersetzt wird, könnte der Interpreter den Code so optimieren, dass die polymorphen eigenschaften "verloren" gehen. "Das Objekt war ein Foo, ist ein Foo und wird immer ein Foo bleiben, warum nennen wir es dann nicht einfach Foo?"
-
Ich mein nicht, dass sich das mit dem Operator widerspricht. Die Bedeutung von + ist polymorph.
Die Wörter statisch und polymorph widersprechen sich. Etwas das statisch ist soll sich plötzlich anders verhalten? Dann ist es doch nicht statisch.
-
Klartext, du solltest dich vielleicht mal nicht ganz so sehr auf C++ versteifen. In Smalltalk z.B. gibt es int-Objekte die auf "+"-Nachrichten reagieren.
Wenn du es mit der Horizonterweiterung übertreibst fällt dir vielleicht sogar auf dass Operator-Overloading auch eine Form von Polyphormie ist, dass Parametrische Polyphormie tatsächlich "richtige" Polyphormie ist, etc.
Und vor allem -- was dir scheinbar am meisten Probleme bereitet: Polyphormie ist kein Synonym für späte Bindung.
-
Wo hab ich gesagt, dass Operatorüberladung nichts mit Polymorphie zu tun hat? Wo hab ich gesagt, dass es nur Polymorphie ist, wenn es eine späte Bindung ist?
Was dir wohl am meisten Probleme bereitet ist etwas zu lesen und zu verstehen.
-
Klartext schrieb:
Die Wörter statisch und polymorph widersprechen sich. Etwas das statisch ist soll sich plötzlich anders verhalten? Dann ist es doch nicht statisch.
-
Und? Wo steht da was von Operatorüberladung oder Bindung?