マルチマトドと過負荷の違い
質問
コンテクスト
私は数年前からJavaでプログラミングを行ってきました。そして、私はまったく違うことを学んでいます:Clojure。そこでは、式の問題はマルチマトドを使用することで解決できますが、Javaでは訪問者のパターンなどのようなものが必要になります。
質問
私はマルチマトドについて読んでおり、メソッドの過負荷との実際の違いと非常に混乱しました。
これまでに私が発見した唯一の違いは、マルチメトッドがメソッドが呼び出されるオブジェクトのランタイムタイプに依存しないことを示しました。
解決
過負荷とは、2つ以上の方法が同じ名前であるが異なる署名(異なる引数タイプ、異なる引数数)の場合です。過負荷は、引数の静的タイプのみに応じて静的に解決されます。 (たとえば、Javaでのオーバーロードとオーバーライドの相互作用により、ストーリーはもう少し複雑になります)。過負荷は、特定のメソッド署名に静的に解決します。その後、実行時に、動的ディスパッチは、その署名で最も適切な方法を選択します。
MultiMethodsは、同じ名前、同じ数の引数を持つメソッドのコレクションであり、 重複 署名を入力します。 (マルチメトッドの名前を使用)マルチメトッドに呼び出しが行われるたびに、コレクション内のすべてのメソッドは、発送の可能性のある候補と見なされます。正確な候補は、引数のランタイムタイプに応じて選択されます - 最も具体的な方法が選択されます。すべての引数の実際のランタイムタイプは、実行するものを決定するために使用されます。これは、メソッドの最初の引数(ターゲット)のみが使用され、どのメソッドボディが実行されるかを決定するために使用されるJavaでの従来のシングルディスパッチとは異なります。
他のヒント
私の理解が進む限り:
多胸膜は、メソッド多型の一般化です。
マルチメトッドは2つの部分で構成されています
名前
a
dispatch method
: :それはaを生成しますdispatch value
この派遣値に基づいて、適切な方法が選択されます。オーバーロードは、ディスパッチメソッドがディスパッチ値として静的タイプを返すマルチマトドの特別なケースです
一般に、ディスパッチ方法は何でもかまいません。タイプ以外の値を返すことができます。