メッセージの受け渡しは、あるオブジェクトが別のオブジェクト(または潜在的にそれ自体)に何かをさせるためのオブジェクト指向コードの必要性を処理する別の方法です。
C ++アプローチから派生した最新のほとんどの言語では、メソッド呼び出しでそれを行います。この場合、呼び出されたオブジェクトは(そのクラス定義を介して)受け入れるメソッド呼び出しの大きなリストを配置し、呼び出し元オブジェクトのコーダーは単に呼び出しを記述します。
public void doSomething ( String input )
...
other_object.dosomething ( local )
静的に型付けされた言語の場合、コンパイラは呼び出されているものの型をチェックし、メソッドが宣言されていることを確認できます。動的に型付けされた言語の場合、実行時に実行されます。
しかし、本質的に起こるのは、変数の束が特定のコードブロックに送信されることです。
メッセージの受け渡し
メソッドの代わりにメッセージパッシング言語(Objective Cなど)には受信者がいますが、それらを定義して呼び出す方法はほぼ同じです。違いは処理方法です。
メッセージが渡された言語では、コンパイラは、呼び出したレシーバーが存在することを確認する場合がありますが、最悪の場合、そこにあるかどうかわからないという警告がポップアップ表示されます。これは、実行時に、受信側オブジェクトのコードブロックが呼び出され、変数のバンドルと呼び出したい受信側の署名の両方が渡されるためです。次に、そのコードブロックは受信者を探して呼び出します。ただし、レシーバーが存在しない場合、コードは単にデフォルト値を返します。
その結果、C ++ / Java-> Objective Cから移行するときに見られる奇妙な点の1つは、コンパイル時の型で宣言されておらず、さらには実行時のタイプ...および呼び出しによって例外がスローされることはなく、実際には結果が返されること。
このアプローチの利点は、サブクラスの階層を平坦化し、インターフェイス/多重継承/ダックタイプのほとんどのニーズを回避できることです。また、オブジェクトは、受信者がいない何かをするように要求されたときのデフォルトの動作を定義することを許可します(一般的に「そうしない場合、この他のオブジェクトにリクエストを転送します」)。また、特にJavaなどの静的に型指定された言語でのコールバック(UI要素や時限イベントなど)へのリンクを簡素化できます(したがって、ボタンは、内部クラスで "actionPerformed"メソッドを呼び出すのではなく、レシーバー "runTest" 「RunTestButtonListener」が呼び出しを行います)。
ただし、開発者が追加のチェックを行う必要がありますが、開発者は、適切なタイプの適切なオブジェクトで適切なパラメータを適切な順序で渡すことができると考えているため、コンパイラが警告すると、実行時に完全に実行されます(デフォルトの応答を返すだけです)。おそらく、追加のルックアップとパラメーターの受け渡しによるパフォーマンスの低下もあります。
最近では、動的に型付けされた言語は、OOを通過したメッセージの多くの利点を、より少ない問題で提供できます。