Identifaktion von Methoden in OO-Sprachen
-
Kennt jemand eine oo-Sprache in der man Methoden über den Rückgabewert überladen kann.
Anders gefragt: Ist es haltbar im Kontext von oo-Sprachen allgemein zu behaupten, dass eine Methode eindeutig durch Klassenname (evtl mit namespace oder package info), Methodenname und Signatur definiert ist.
-
Signatur schließt für mich den Rückgabewert ein...
IIRC kann Lisp auf den Rückgabetyp überladen. Bei funktionalen Sprache ist das IMHO so gängig.
In C++ kann man das ja auch simulieren
-
Shade Of Mine schrieb:
In C++ kann man das ja auch simulieren
Wie das?
-
Shade Of Mine schrieb:
IIRC kann Lisp auf den Rückgabetyp überladen.
In Lisp kann man gar nicht überladen, weil Lisp kein statisches Typsystem hat.
Soweit ich weiß, kann man in Ada Funktionen nach ihrem Rückgabetyp überladen.
-
Shade Of Mine schrieb:
Signatur schließt für mich den Rückgabewert ein...
IIRC kann Lisp auf den Rückgabetyp überladen. Bei funktionalen Sprache ist das IMHO so gängig.
Meinst Du in Bezug auf Lisp die Methodendefinition mit defmethod? Ich kenne CLOS leider kaum, aber ist die Syntax der Definition nicht ungefähr so:
(defmethod methodname parameterlist body)
Da kann ich doch aus der Signatur den Rückgabewert gar nicht bestimmen. Kannst Du mir vielleicht ein Beispiel zeigen das Methoden über den Rückgabewert überlädt oder mir einen Link geben, in dem das beschrieben ist. Hab diesbzgl. nichts gefunden.
-
Bashar schrieb:
Shade Of Mine schrieb:
IIRC kann Lisp auf den Rückgabetyp überladen.
In Lisp kann man gar nicht überladen, weil Lisp kein statisches Typsystem hat.
Soweit ich weiß, kann man in Ada Funktionen nach ihrem Rückgabetyp überladen.
OK, da war wohl jemand schnell, oder ich zu langsam.........Ada also....schau ich mach mich mal schlau!
-
Jester schrieb:
Wie das?
Hässlich, sehr hässlich.
ich poste mal etwas Code aus einem Projekt von mir:
Verwendung für zB
template<typename T1, typename T2>
?? max(T1 a, T2 b);Dieser Evaluator hilft die Arbeit zu erledigen.
template<typename A, typename B, class Eval> class Evaluator { private: A const& a; B const& b; public: Evaluator(A const& a, B const& b) : a(a), b(b) {} operator A const&() const { return Eval::template eval<A>(a, b); } operator B const&() const { return Eval::template eval<B>(a, b); } template<typename T> T const& as() const { return Eval::template eval<T>(a, b); } }; template<typename A, class Eval> class Evaluator<A, A, Eval> { private: A const& a; A const& b; public: Evaluator(A const& a, A const& b) : a(a), b(b) {} operator A const&() const { return Eval::template eval<A>(a, b); } template<typename T> T const& as() const { return Eval::template eval<T>(a, b); } };
nun haben wir noch den, der die Arbeit macht (improvisiert):
struct MaxEval { template<typename R, typename T1, typename T2> R eval(T1 a, T2 b) { if(a>b) return a; return b; } };
nun haben wir noch max() (ebenfalls improvisiert)
template<typename T1, typename T2> Evaluator<T1, T2, MaxEval> max(T1 a, T2 b) { return Evaluator<T1, T2, MaxEval>(a, b); }
Vermutlich müsste man noch die Werte im Evaluator als Zeiger speichern um diesen Code zum laufen zu bringen (ich verwende das bei mir für etwas anderes und da wird er nicht kopiert).
Die Idee sollte aber klar sein, oder?
@Bashar:
Dann habe ich mich wohl geirrt. Muss wohl etwas Lisp-ähnliches gewesen sein, weil es da auch so komische Klammern und ' gab...
-
Kennt jemand eine oo-Sprache in der man Methoden über den Rückgabewert überladen kann.
Es gibt fast alles, aber das bezweifle ich stark. In Sather kann man beispielsweise danach überladen, ob ein Wert zurückgegeben werden soll oder nicht. ADA wurde als Beispiel gebracht für eine Sprache, wo man generell den Typ verwenden kann. Aber den Rückgabewert zu verwenden halte ich für schwachsinnig.
-
Helium schrieb:
Kennt jemand eine oo-Sprache in der man Methoden über den Rückgabewert überladen kann.
Es gibt fast alles, aber das bezweifle ich stark. In Sather kann man beispielsweise danach überladen, ob ein Wert zurückgegeben werden soll oder nicht. ADA wurde als Beispiel gebracht für eine Sprache, wo man generell den Typ verwenden kann. Aber den Rückgabewert zu verwenden halte ich für schwachsinnig.
Recht hast Du.
Es war der Typ des Rückgabewertes gemeint.