読者です 読者をやめる 読者になる 読者になる

このままでいっか

アニメとか,プログラミングとか,研究とか,思ったことそのまま書く感じで

多重ディスパッチと単一ディスパッチの違いってなんだ?

はろー,あぶです.

前からCommonLispの勉強をしていますが,そこでCommonLispは多重ディスパッチをサポートする言語だという記述を見かけました.

そこで僕は思いました.

多重ディスパッチってなんだ!?

とりあえず安心のGoogle先生にたずねてみるとこんな感じの検索結果が返ってきました(灰色なのはアドオンで変えてるからです).

f:id:dbym4820:20160407184022p:plain

とりあえずWikipediaさんにお世話になりましょう.


多重ディスパッチ(英: Multiple dispatch)またはマルチメソッド(英: Multimethods)は、多重定義された関数やメソッドからそこで呼び出されるべき1つの定義を選出し実行する(ディスパッチする)際に、2個以上の複数の引数が関与してどれかひとつを選ぶこと(特殊化)がおこなわれるものである。

(Wikipedia:多重ディスパッチ)



んー,なるほど,わからん...

どうやらJavaは単一ディスパッチと呼ばれるらしい.

Javaとかのオーバーロードと何が違うんでしょう?

Wikipediaの1行目を見ただけだと,やっぱりJavaオーバーロードと同じことをいってるような気がする...?

CLOSの総称関数もJavaオーバーロードも,引数の異なる同じ名前の関数を定義してその引数の型や数によって実行するメソッドを変える仕組みなんじゃ...?

なにがちがうんだ?

結局わからないままです. そもそも全く違う概念なのでしょうか? 比較するレベルが間違っているのでしょうか?

偉い人,誰かおしえてくれませんか(;_;)





(以降2016/06/04追記)

同様の疑問をQiitaで投げたところ,あのκeenさんから答えをいただけました!

僕はメソッドは常に特定の単一のクラスに属しているものだと考えていたのですが,多重ディスパッチの考え方は単一のクラスに属するという考え方ではないようです.

多重ディスパッチをサポートしている言語では,複数のクラスに基いてメソッドが選ばれるわけですね.

オーバーロードと多重ディスパッチの違いも具体例を出して教えていただけました.

詳しくはこちらの記事のコメント欄に書いていただいています.