caller ist vergleichbar mit this, beschreibt aber nicht das Objekt, dessen Methode gerufen wurde, sondern das Objekt, das diese Funktion rief. Caller kann also eine statische Funktion, aber auch eine Methode sein und wird - wie this - automatisch übergeben. Caller kann gewisse Eigenschaften besitzen, abgeleitete Objekte eignen sich also ebenso als Caller. Caller kann optional sein.
Sinn der Sache ist, dass Klassen beispielsweise in einem Klassenverbund arbeiten, zum Beispiel einem Baum. Hier gibt es beispielsweise ein Parent oder eben Kinder, die über diese Aktion ebenfalls informiert werden sollen.
Ich möchte also eine Funktion abhängig vom Aufrufenden überladen.
class Vorname;
{
char const * Vorname;
construct( Vorname );
doSomeThing() := CallMyName();
doSomeThing() from Nachname := { print Vorname + " " + caller.Nachname; }
};
class NachName
{
char const * Nachname;
construct( Nachname );
doSomeThing() := CallMyName();
foobar(v is Vorname) := v.doSomething();
};
CallMyName is code() := print "Keine Ahnung";
CallMyName is code() from Vorname := print caller.Vorname;
CallMyName is code() from Nachname := print caller.Nachname;
CallMyName();
Vorname("Sascha").doSomeThing();
Nachname("Atrops").foobar( Vorname("Sascha") );