Definition: Polymorphie



  • Templates interpretieren ist und bleibt Templates interpretieren, egal wann es gemacht wird und was erzeugt wird.

    Wenn du verschiedene Klassen hast die alle eine "draw" Methode haben und z.B. nen Kreis, ne Linie und ein Rechteck zeichenen, dann kann die Basisklasse polymorphes Verhalten aufweisen, je nachdem wie es überschrieben wurde.

    Wenn du jetzt nur eine Klasse hast und die ein Template nimmt auf den "Kreis", "Linie" oder "Rechteck" steht und die dann das entsprechende zeichnet, dann ist das keine Polymorphie, sondern es sind einfach nur unterschiedliche Eingabeparameter. Und wenn dazu Code erzeugt wird der das entsprechende zeichnet, ist es auch nur Template interpretieren.



  • DEvent schrieb:

    Mir persönlich ist das zu eng definiert. Denn wann ich kompiliere ist nur eine Implementierungsfrage - die .NET Generics zB kompilieren die Templates on demand. In Java wird zB garnichts kompiliert bei den Generics, da werden "nur" Textersetzungen gemacht. Deshalb finde ich es immer komisch wenn man anhand des kompilierens etwas definieren will.

    Ich habe aber auch anhalten, kompilieren, und neu starten gesagt. Wenn man z.B. COM, Serialisierung oder Reflection benutzt, dann muss man das Programm weder anhalten noch neu uebersetzen, um das Objekt zu benuzten.

    Das finde ich eines der wichtigsten Vorteile von Polymorphie, man kann das Objekt zur Laufzeit des Programmes austauschen.

    Wie sieht es mit .NET aus? Dort werden Generics zur Laufzeit kompiliert. Ich kann einen Typen herumreichen und dann daraus zB eine Collection erstellen die dann eben erst kompiliert wird. Der Typ muss dabei nicht von mir vorgegeben werden sondern kann von irgendeinem Plugin kommen.

    Auf Plattformen wie Java und .NET gibt es keine Trennung von kompilierung und laufzeit. Und ein C++ interpreter wuerde sowieso nie kompilieren...

    Aber das was du meinst ist eben _dynamische_ Polymorphie. Sie hat durchaus ihre Vorteile gegenueber statischer Polymorphie. Aber die Idee dahinter ist die selbe. Ich schicke eine Botschaft an einen Empfaenger und dieser reagiert unterschiedlich. Worueber wir hier reden ist die Definition wie man Botschaften sendet, nicht was Polymorphie ist. Wer aus der Java Ecke kommt wird statische Polymorphie nie aktzeptieren koennen, wer aus einer JavaScript Ecke kommt wird Interfaces nie aktzeptieren koennen. Es sei denn die Leute fangen an ueber ihren Horizont zu schauen 😉

    Viele Design Pattern die polymorphie verlangen sind mit statischer Polymorphie problemlos loesbar: darunter wohl am bekanntesten: Strategy, Iterator,...



  • 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?


Anmelden zum Antworten