Ist das alles Polymorphismus?
-
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.)
-
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ß
-
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.