LINEスタンプ制作代行サービス・LINEスタンプの作り方!

お電話でのお問い合わせ:03-6869-8600

stampfactory大百科事典

多重ディスパッチ

多重ディスパッチ()またはマルチメソッド()は、多重定義された関数やメソッドからそこで呼び出されるべき1つの定義を選出し実行する(ディスパッチする)際に、2個以上の複数の引数が関与してどれかひとつを選ぶこと(特殊化)がおこなわれるものである。多重定義を許すプログラミング言語では、同一の名前の(すなわち、多重定義された)関数やメソッドのうちのどれを呼出す(ディスパッチする)かを決定する、ということをしなければならない。多くのオブジェクト指向プログラミング言語は単一ディスパッチである。すなわち、メソッド呼び出し(Smalltalkなら「メッセージ送信」、C++なら「メンバ関数呼び出し」)において、引数の1つが特別に扱われ、呼び出すべきメソッドの特定に使われる。構文上もその引数を特別に扱い、ドットを挟んで、そのオブジェクトを選択する式と、呼び出すべきメソッドの名前を記述する(例えばcodice_1)。(これは、そのような言語ではそのメソッドをそのオブジェクトが「所有する」ような形となるため、オブジェクトによって名前空間を指定するのが自然であるため、という理由もある)多重ディスパッチを採用する言語では、全ての引数がメソッド選択という観点では平等に扱われる。第一引数、第二引数、第三引数とマッチングを行うが、どれか特定の引数がその関数やメソッドを「所有」しているわけではない。初期の多重ディスパッチを採用した例として Common Lisp Object System がある。多重ディスパッチと単一ディスパッチの違いは例を見れば明らかになるだろう。宇宙船や小惑星といったオブジェクトが出てくるゲームを想定する。2つのオブジェクトが衝突する場合、何と何が衝突するかによってプログラムは様々な反応をすると想定する。Java のように単一ディスパッチしかしない言語では、コードは次のようになる(ただし、Visitor パターンをこれに活用することも可能)。Common Lispのように多重ディスパッチをする言語では、コードは次のようになる。このように、引数のデータ型を調べるコードを、引数部分に完全に組み込むことができている。多重ディスパッチがあると、クラスがあって、そこにメソッドが属しているという考え方はあまり意味を持たない。"collide-with" という名前のメソッドは、引数ごとにそれぞれ2つのクラスと関連付けられている「普通の関数呼び出し」に過ぎなくなる。結果として、メソッドを呼び出す際の特殊な構文を必要としない。C++のオーバーロードはコンパイル時に静的に引数のデータ型を調べることでなされる。従って、実行時に動的に引数のデータ型を調べる多重ディスパッチとは異なる。言語として多重ディスパッチをサポートしていない場合でも、ライブラリによる拡張で多重ディスパッチ機能を追加することは可能である。例えば、Python にCLOS風のマルチメソッド機能を追加するモジュール "multimethods.py" がある。機能的には CLOS の例によく似ているが、その構文は通常の Python のものである。Python 2.4 の decorators を使って、グイド・ヴァンロッサムはマルチメソッドのサンプル実装を行い、構文を単純化した。汎用のマルチメソッド機能をサポートするプログラミング言語は次のとおりである。何らかの拡張でマルチメソッドをサポートする言語として、次のものがある。

出典:wikipedia

LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。