Ist das alles Polymorphismus?



  • 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.)



  • Chewie83 schrieb:

    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 hätte bei Nachrichten eher an Nachrichten die übers Netz verschickt werden oder WinAPI Messages gedacht.



  • Komisch schrieb:

    OK, "Nachricht senden" soll also Methode aufrufen heißen...

    Ich hätte bei Nachrichten eher an Nachrichten die übers Netz verschickt werden oder WinAPI Messages gedacht.

    Der Begriff ist auch durchaus mehrdeutig, du wirst aber an vielen Stellen über "Nachricht=Methode" stoßen, gerade auch in theoretischen Büchern über Objektorientierte Analyse/Design/Programmierung.

    cu André



  • asc schrieb:

    Komisch schrieb:

    OK, "Nachricht senden" soll also Methode aufrufen heißen...

    Ich hätte bei Nachrichten eher an Nachrichten die übers Netz verschickt werden oder WinAPI Messages gedacht.

    Der Begriff ist auch durchaus mehrdeutig, du wirst aber an vielen Stellen über "Nachricht=Methode" stoßen, gerade auch in theoretischen Büchern über Objektorientierte Analyse/Design/Programmierung.

    Man sollte darauf hinweisen, dass gerade die Nachricht im Kontext der WinAPI *dasselbe* ist wie das OOP-Konzept. Schließlich handelt es sich hierbei um ein objektorientiertes Framework, und das Nachrichtensenden der WinAPI ist genau das, was man in Smalltalk macht: Man sendet einer Instanz (hier einer Instanz einer Klasse, die per 'CreateWindowClass' erzeugt worden ist) eine Methode, die diese ausführen soll. Lediglich die Syntax ist um einiges umständlicher, da die WinAPI eben um die inadäquaten C-Sprachmittel herumschiffen muss.



  • Konrad Rudolph schrieb:

    Man sollte darauf hinweisen, dass gerade die Nachricht im Kontext der WinAPI *dasselbe* ist wie das OOP-Konzept. Schließlich handelt es sich hierbei um ein objektorientiertes Framework, und das Nachrichtensenden der WinAPI ist genau das, was man in Smalltalk macht: Man sendet einer Instanz (hier einer Instanz einer Klasse, die per 'CreateWindowClass' erzeugt worden ist) eine Methode, die diese ausführen soll. Lediglich die Syntax ist um einiges umständlicher, da die WinAPI eben um die inadäquaten C-Sprachmittel herumschiffen muss.

    Die Nachrichten werden aber an jeden gesendet und nicht an ein Objekt.



  • ......... schrieb:

    Konrad Rudolph schrieb:

    Man sollte darauf hinweisen, dass gerade die Nachricht im Kontext der WinAPI *dasselbe* ist wie das OOP-Konzept. Schließlich handelt es sich hierbei um ein objektorientiertes Framework, und das Nachrichtensenden der WinAPI ist genau das, was man in Smalltalk macht: Man sendet einer Instanz (hier einer Instanz einer Klasse, die per 'CreateWindowClass' erzeugt worden ist) eine Methode, die diese ausführen soll. Lediglich die Syntax ist um einiges umständlicher, da die WinAPI eben um die inadäquaten C-Sprachmittel herumschiffen muss.

    Die Nachrichten werden aber an jeden gesendet und nicht an ein Objekt.

    Nein, die Nachrichten werden im Normalfall nur an ein einziges Objekt gesendet, das durch den Window-Handle spezifiziert wird. Es gibt allerdings Ausnahmen (Broadcasts). Aber das ist ja quasi auch nur ein Shortcut.



  • Hab eigentlich an Hooks gedacht, da kann man ja alles mithören. Gibt halt keine Kapselung.



  • Hm, nachdem ich jetzt die meisten der Quellen nachgeschlagen habe, fällte es mir dennoch schwer von meinem Standpunkt abzurücken. 🙂

    Es gibt natürlich ältere Definitionen von polymorphen Verhalten bzw. Polymorphismus in denen überladene Funktionen dann z.B. in der Kategorie ad hoc polymorphism bzw. static polymorphism auftauchen. Alle Autoren (z.B. Herb Sutter, Scott Meyers, ...), die den Begriff auf diese Weise verwenden, unterscheiden aber auch klar, indem sie die entsprechenden Zusätze verwenden (ad hoc, static, compile-time, run-time, ...)

    Wird der Begriff frei, also ohne Zusätze, im Zusammenhang mit OOP und C++ verwendet, was bei der (erdrückenden) Mehrheit der Autoren der Fall ist, dann geht es immer um dynamische Bindung. So wird der Begriff im Allgemeinen auch verstanden.

    @queer_boy
    Tutorials und Wikipedia sind nicht unbedingt gesicherte Quellen. Z.B. sieht das im deutschen Wikipedia schon ganz anders aus, da bestreitet der Autor, dass Überladung eine echte Form der Polymorphie ist. Damit hat er natürlich auch Recht, denn Überladung ist eigentlich nur eine syntaktische Hilfe für den Programmierer. Von polymorphem Verhalten kann (eigentlich) keine Reder sein.

    @Shade Of Mine
    Im "nicht OOP Teil" von C++ kann man Funktionen schon garnicht überladen, d.h. die Diskussion in der Richtung erübrigt sich. Genauso wie die Diskussion über den Begriff Polymorphie in Bezug auf funktionale Sprachen. Das ist wieder etwas Anderes. Bitte bei der Sache bleiben. 🙂

    @Konrad Rudolph
    Sehe ich genauso. Der Begriff Polymorphismus wurde in diesem Zusammenhang schon in verschiedenen Formen verwendet zu denen auch eine gewisse Systematik existiert (ad-hoc, universal, ... )
    Ich finde, wenn man sich aber auf diese Systematik beruft, dann muss man auch die vollständigen Begrifflichkeiten verwendet. Ich bin Überzeugt, im Lehrbuch von Squall tauchen sie so nicht auf.

    Wie asc schon bemerkte können wir da aber wohl kaum eine Einigung erziehlen. Also, ich bleibe jedenfalls dabei, dass ich unter Polymorphie im Zusammenhangt mit CPP und OOP erst einmal die Definition aus z.B. dem Informatik-Handbuch verstehe und erst wenn jemand Begriffe wie statische Polymorphie, ad hoc Polymorphismus, parametrischer Polymorphismus, usw. ... gebraucht, dann schalte ich um auf die vorher genannte Systematik in der dann auch überladenen Funktionen ad hoc, statisch oder compile-time polymorphes Verhalten zugestanden wird.

    Gruß


  • Mod

    vic1986 schrieb:

    Wird der Begriff frei, also ohne Zusätze, im Zusammenhang mit OOP und C++ verwendet, was bei der (erdrückenden) Mehrheit der Autoren der Fall ist, dann geht es immer um dynamische Bindung. So wird der Begriff im Allgemeinen auch verstanden.

    Mit "im Allgemeinen" würde ich nach so einer langen Diskussion vorsichtiger umgehen - wenn ich es richtig verstehe, ist das analog zu: Ein Auto ist ein Mercedes, es sei denn, es wird auch von BMWs, VWs etc. gesprochen?
    Wenn dynamische Bindung gemeint ist, kann man sie auch so bezeichnen - hat man mehrere Begriffe exakt das Gleiche, so sind alle diese Begriffe bis auf einen überflüssig.



  • Es gibt natürlich ältere Definitionen von polymorphen Verhalten bzw. Polymorphismus in denen überladene Funktionen dann z.B. in der Kategorie ad hoc polymorphism bzw. static polymorphism auftauchen. Alle Autoren (z.B. Herb Sutter, Scott Meyers, ...), die den Begriff auf diese Weise verwenden, unterscheiden aber auch klar, indem sie die entsprechenden Zusätze verwenden (ad hoc, static, compile-time, run-time, ...)

    Polymorphie:={ad hoc,static,compile-time,run-time}

    Das sind alles untermengen, und natürlich sprechen die Authoren nur von der Untermenge, die sie gerade meinen. Wenn man ein Konzept vorstellt, nennt mans eben beim namen.

    Wird der Begriff frei, also ohne Zusätze, im Zusammenhang mit OOP und C++ verwendet, was bei der (erdrückenden) Mehrheit der Autoren der Fall ist, dann geht es immer um dynamische Bindung. So wird der Begriff im Allgemeinen auch verstanden.

    compile-time Polymorphie ist auch ein relativ "neues" Konzept in C++ oder in der Programmierung ansich. Die meisten authoren kennen eben nur den "alten" Polymorphiebegriff, und benutzen ihn so. Dass sich da vielleicht inzwischen was geändert hat, dass die Welt größer wurde, ist bei manchen Authoren vielleicht noch nicht so durchgesickert(oder die Bücher sind schlicht zu alt, oder es geschah aus didaktischen gründen, oder...).
    Dass dies so ist, verwundert einen auch nicht. Ich seh inzwischen immer malwieder C++ Code aus anderen projekten durch, und in vielen kommt nicht ein template oder ähnliche Konstrukte vor. Da wird C++ wie Java oder C mit Klassen programmiert, und natürlich hat dort eine Unterscheidung zwischen verschiedenen Polymorphieformen keinen Sinn, weil es für diese Programmierer scheinbar alles was über den Java horizont hinaus geht nicht gibt.

    //edit btw:

    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. ...)

    Balzert hier als kompetenz genannt? Hier in der C++ hochburg? reicht es nicht, dass ich den bereits als dozenten ertragen muss? 😞



  • Ich hab noch nie ein polymorphes Template gesehen, sondern nur Templates die die Polymorphie von den verwendeten klassen oder Operatoren erben. Ich glaub auch nicht, dass es sowas gibt, würde aber gern mal eines sehen.



  • template <class Vehicle>
    void foo (Vehicle& v)
    {
       v.accelerate();
    }
    

    mit concepts wird das noch eindeutiger

    template <Vehicle vehicle_t>
    void foo (vehicle_t& v)
    {
       v.accelerate();
    }
    

    sprich: alles, was ein vehicle ist, kann beschleunigt werden; egal ob das jetzt ein auto, ein schiff oder ein boot ist.



  • Urab schrieb:

    Ich hab noch nie ein polymorphes Template gesehen, sondern nur Templates die die Polymorphie von den verwendeten klassen oder Operatoren erben. Ich glaub auch nicht, dass es sowas gibt, würde aber gern mal eines sehen.

    Per Definition *sind* Templates das, was „parametrische Polymorphie“ genannt wird.



  • otze schrieb:

    ... Balzert hier als kompetenz genannt? Hier in der C++ hochburg? reicht es nicht, dass ich den bereits als dozenten ertragen muss? 😞 ...

    Dann habe ich aber eine Vision. Ich sehe einen Besuch in der Sprechstunde und die Klärung der Angelegeheit mit Hilfe akademischer Kompetenz von höchster Stelle. 😃



  • camper schrieb:

    ... Ein Auto ist ein Mercedes, es sei denn, es wird auch von BMWs, VWs etc. gesprochen? ...

    Ja, so sehe ich das. Wenn in einem C++ Buch von Polymorphie gesprochen wird und es ist nicht explizit die geschilderte Systematik erwähnt, dann ist immer der spezielle Begriff gemeint.



  • So ein Sch***,
    Da gibts noch nicht mal eindeutige Definitionen der Begriffe.
    Wie soll man da was Klares lernen?
    Also muss ich mich nach der Version meines Dozenten richten.

    Es sieht auch so aus, als hätte sich der Begriff Polymorphie innerhalb einer
    Zeitspanne gändert. Was vor xx jahren noch eine genaue Beschreibung hatte, ist
    nun Mehrdeutig zu verstehen.

    Naja, dann halt ich mich erstmal an die Weisheiten meines Profs.
    Der wird ja bestimmt mehrere Definitionen kennen, da er ja schon zig Jahre C / C++ lehrt.



  • Quellcode schrieb:

    So ein Sch***,
    Da gibts noch nicht mal eindeutige Definitionen der Begriffe.

    Das ist leider bei enorm vielen Begriffen in der EDV so. Nicht mal „OOP“ ist eindeutig definiert. Daher fängt jeder Wissenschaftler, der etwas echtes veröffentlichen möchte, auch erst mal an, seitenlang Begriffe zu klären. Riesige Zeitverschwendung.



  • Quellcode schrieb:

    Naja, dann halt ich mich erstmal an die Weisheiten meines Profs. Der wird ja bestimmt mehrere Definitionen kennen, da er ja schon zig Jahre C / C++ lehrt.

    In der Regel wirst du davon ausgehen können, das er genau eine Definition kennt. Die meisten Dozenten lernen (meiner Erfahrung nach) genau einmal und der Stand hat dann für sie Gültigkeit (im schlimmsten Fall bis zur Pension).

    Im Studium ist es tatsächlich so das man lieber die Definition eines Dozenten lernen sollte (ob richtig oder nicht).

    cu André



  • asc schrieb:

    Die meisten Dozenten lernen (meiner Erfahrung nach) genau einmal und der Stand hat dann für sie Gültigkeit (im schlimmsten Fall bis zur Pension).

    Na, das sind die Negativbeispiele. Jeder halbwegs interessierte Forscher bildet sich ständig weiter. Die Leute existieren ja nicht nur als Lehrer sondern haben in erster Linie eine wissenschaftliche Berufung.



  • Konrad Rudolph schrieb:

    asc schrieb:

    Die meisten Dozenten lernen (meiner Erfahrung nach) genau einmal und der Stand hat dann für sie Gültigkeit (im schlimmsten Fall bis zur Pension).

    Na, das sind die Negativbeispiele. Jeder halbwegs interessierte Forscher bildet sich ständig weiter. Die Leute existieren ja nicht nur als Lehrer sondern haben in erster Linie eine wissenschaftliche Berufung.

    Oder die Wissenschaftler meinen, dass es nicht wirklich Polymorphie ist, obwohl es eine Sprache gibt in der es aus Marketinggründen so genannt wird.


Anmelden zum Antworten