Duck Typing in C++ ?
-
Hallo:
wäre es eigentlich --- rein theoretisch! --- möglich, C++ zu einer
dynamisch getypten Sprache zu machen, also zu einer Sprache, in der man
zur Compile-Zeit keinerlei Typangaben zu machen braucht ?Ich stelle mir das so vor: Eine Klasse "Object", von der *alle* anderen
Klassen (inkl. Zahlen, Strings, Files,...) Unterklassen sind
(soll heißen: alle Klassen sollen von der Klasse "Object" erben).
Dann könnte man doch die Typangaben aller Funktionen und Methoden durch die Typangabe "Object" ersetzen, und könnte theoretisch jede Funktion mit jeder beliebigen Sorte von Objekt als Argumente aufrufen, da ja jede Klasse Unterklasse von "Object" wäre, also jedes Objekt zur Typangabe "Object" paßt.
Der Compiler dürfte dann doch nie meckern.Ob die Parameter dann zur Funktion passen oder nicht (d.h. ob die
Objekte passende methoden anbieten, wie sie in der Funktion aufgerufen werden
oder nicht), stellt sich dann erst zur Laufzeit heraus.
Im Ergebnis entspräche das doch dem "Duck Typing", wie es in Ruby und anderen
dynamisch getypten Sprachen stattfindet: kein Typcheck zur Compilezeit.Natürlich müßte man dann alle Libraries umschreiben, sodaß Zahlen und
String und Files, Felder und Listen etc. alles Unterklassen von "Object" sind, aber davon mal abgesehen, und davon, ob der Aufwand vernünftig ist oder nicht:
Ginge das prinzipiell ? Wäre dann C++ wie eine dynamisch getypte Sprache
verwendbar ?Beispiel:
Object main(Object c, Object v) {
cout << "Anzahl Argumente:" << c << endl ;
Object n ;
n = 3 ;
n := n * 2 ;
cout << "2*3=" << n << endl ;
}
-
Wären alle Klasse Unterklassen einer globalen Klasse "Object",
dann könnte man, wenn man in der STL class Object als Template-Klasse benutzt, wohl auch so lockere Sachen schreiben wie:vector<Object> v ;
v.push_back("hallo");
v.push_back(3);also eine Liste aus Objekten verschiedener Art. Ganz ähnlich wie in Perl,Python,Smalltalk,Ruby und Co.
Wäre doch vielleicht die Mühe des Umschreibens der Includes wert?
-
Hallo
machbar wär das grundsätzlich schon, wie du schon selbst sagst über die Objektvererbung. Doch ich denke da werden auch einige der C (++) Besonderheiten dabei draufgehen, zum Beispiel eben genau die Typkontrolle. Außerdem vergißt du das die dynamsiche Typüberprüfung bzw. RTTI eben Laufzeit kostet.
In C++ verwendet man dafür auch Templates, um eingeschränkte Typfreiheit zu bekommen.bis bald
akari
-
Also wenn man das so umsetzen würde, hättest du aber ein dicken Haufen mehr Laufzeitfehler, da dann jede Methode, welche eigentlich nur für bestimmte Datentypen funktionieren, zur Laufzeit völlig falsch aufgerufen werden könnte.
Denke es gibt noch 1000 weitere Gründe die dagegen sprechen...
-
Hallo:
akari:
Die Typkontrolle geht weg, da hast Du vollkommen Recht - das ist dann eben das neue "Feature", denn die (zur Compile-Zeit) fehlende Typkontrolle sorgt
ja in den (im Augenblick sehr in Mode geratenen) dynamisch getypten Sprachen für den lockeren "Rapid Prototyping" - Programmierstil, bei dem man zur Compile-Zeit keine Typen angibt, was dem
Programmierer einiges an Arbeit spart.
Natürlich kann man dann unangenehme
Überraschungen zur Laufzeit erleben, wenn eine Funktion auf ein Objekt angewandt
werden soll, das die gefragte Methode nicht liefert. Es liegt dann am
Programmierer, das Risiko zu begrenzen.Tobias W:
Ich meine ja nicht, daß C++ immer so verwendet werden sollte wie beschrieben.
Ich finde aber, daß man auf diese Weise eine Sprache hätte, bei der man
bei Bedarf (wenn man auf Typsicherheit und Performance Wert legt)
die Typen zur Compilezeit festlesgen kann, und wenn das nicht nötig
ist (s. Rapid Prototyping) könnte man "dynamisch" typen und beide Formen
mischen, sodaß performance-kritische Routinen statisch getypt werden und
z.B. das GUI ohne Typangaben programmiert wird, was Programmierzeit spart
und das Programm verkürzt.Wenn das wirklich ginge, könnte man bei Bedarf C++ ähnlich wie
Python oder Ruby benutzen, allerdings wohl nicht ganz genauso: bei
der Verwendung von Funktionen oder Funktionszeigern als Argumente für
Funktionen müßte man in C++ trotz "class Object" noch die Anzahl
Argumente vor dem Aufruf festlegen, d.h. eine Funktion vom Typ Object f(Object, Object)
wäre nicht übergebbar als Argument, wenn eine Funktion vom Typ Object f(Object) verlangt ist.
Das ließe sich vermutlich nur lösen, wenn auch Funktionen in C++ Objekte
wären, und das ist vermutlich schwieriger oder unmöglich zu machen, ohne
die Sprachspezifikation zu ändern, denn letztendlich müßte man dann
einen "alles ist ein Objekt"-Ansatz in C++ realisieren, und das scheint
mir doch im Moment ein wenig "Science-Fiction" zu sein.Grüße
-
Hallo,
abgesehen von dem, was hier schon geschrieben wurde: C++ *hat* Duck Typing! Sonst würde folgender Code nicht funktionieren:
template <typename T> void times_two(T& x) { x *= 2; }Es ist statisch, aber das macht es nicht weniger zu Duck Typing. Es geht halt nur für generische Typen.
-
Hallo:
Danke für den Hinweis!
Beste Grüße.