Die Nachrichtenübergabe ist eine andere Methode, um das Erfordernis im OO-Code zu handhaben, dass ein Objekt ein anderes Objekt (oder möglicherweise sich selbst) veranlasst, etwas zu tun.
In den meisten modernen Sprachen, die vom C ++ - Ansatz abstammen, machen wir das mit Methodenaufrufen. In diesem Fall gibt das aufgerufene Objekt (über seine Klassendefinition) eine große Liste der von ihm akzeptierten Methodenaufrufe an, und der Codierer des aufrufenden Objekts schreibt einfach den Aufruf:
public void doSomething ( String input )
...
other_object.dosomething ( local )
Bei statisch typisierten Sprachen kann der Compiler dann den Typ des aufgerufenen Objekts überprüfen und bestätigen, dass die Methode deklariert wurde. Bei dynamisch getippten Sprachen erfolgt dies zur Laufzeit.
Im Wesentlichen passiert jedoch, dass ein Bündel von Variablen an einen bestimmten Codeblock gesendet wird.
Nachrichtenübergabe
In Message-Passing-Sprachen (wie Objective C) gibt es anstelle von Methoden Empfänger, aber der Ansatz, sie zu definieren und aufzurufen, ist im Großen und Ganzen derselbe - der Unterschied liegt in der Art und Weise, wie sie behandelt werden.
In einer Message-Passed-Sprache darf der Compiler überprüft , ob der von Ihnen angerufene Empfänger vorhanden ist. Im schlimmsten Fall wird jedoch eine Warnung , die besagt, dass er nicht sicher ist, ob er vorhanden ist. Dies liegt daran, dass zur Laufzeit ein Codeblock auf dem empfangenden Objekt aufgerufen wird, der sowohl das Variablenbündel als auch die Signatur des Empfängers übergibt, den Sie aufrufen möchten. Dieser Codeblock sucht dann nach dem Empfänger und ruft ihn auf. Wenn der Empfänger jedoch nicht existiert, gibt der Code einfach einen Standardwert zurück.
Infolgedessen besteht eine der Besonderheiten beim Wechsel von C ++ / Java -> Objective C darin, dass Sie eine Methode für ein Objekt "aufrufen" können, das nicht für den Typ "Kompilierungszeit" deklariert wurde und auf dem es nicht einmal vorhanden war der Laufzeit-Typ ... und dass der Aufruf nicht dazu führen würde, dass eine Ausnahme ausgelöst wird, sondern dass tatsächlich ein Ergebnis zurückgegeben wird.
Der Vorteil dieses Ansatzes besteht darin, dass die Unterklassenhierarchie geglättet wird und die meisten Anforderungen an Schnittstellen / Mehrfachvererbung / Ententypen vermieden werden. Außerdem können Objekte das Standardverhalten definieren, wenn sie aufgefordert werden, etwas zu tun, für das sie keinen Empfänger haben (normalerweise "wenn ich es nicht tue, leite die Anfrage an dieses andere Objekt weiter"). Es kann auch die Verknüpfung mit Rückrufen (z. B. für Benutzeroberflächenelemente und zeitgesteuerte Ereignisse) vereinfachen, insbesondere über statisch typisierte Sprachen wie Java (Sie können also den Empfänger mit der Schaltfläche "runTest" aufrufen, anstatt die "actionPerformed" -Methode für die innere Klasse aufzurufen) "RunTestButtonListener", der den Aufruf für Sie erledigt).
Es scheint jedoch auf Kosten der Notwendigkeit einer zusätzlichen Überprüfung durch den Entwickler zu gehen, dass der Aufruf, den er zu tätigen glaubt, sich auf dem richtigen Objekt mit dem richtigen Typ befindet und die richtigen Parameter in der richtigen Reihenfolge übergibt, da der Compiler dies möglicherweise nicht tut warnen Sie und es wird perfekt zur Laufzeit ausgeführt (nur eine Standardantwort zurückgeben). Die zusätzliche Suche und das Übergeben von Parametern sorgen für einen Performance-Hit.
Heutzutage können dynamisch typisierte Sprachen viele Vorteile von Message Passed OO mit weniger Problemen bieten.