本文へスキップ

多重ディスパッチとは?

たじゅうでぃすぱっち

多重ディスパッチとは、関数メソッドの呼び出し先を、レシーバーだけでなく複数の引数の実行時の型に基づいて動的に決定するプログラミングの仕組みです。

多重ディスパッチ(Multiple Dispatch)は、関数の多態性(ポリモーフィズム)の一形態で、複数引数すべての実行時型に基づいて呼び出すべき関数の実装を選択する仕組みです。Javaや C++ で用いられる通常のオーバーライドは「単一ディスパッチ」と呼ばれ、レシーバーオブジェクトの型だけで呼び出し先が決まりますが、多重ディスパッチではすべての引数が選択に参加します。

多重ディスパッチが自然に欲しくなる典型的な場面として、二つのオブジェクトの組み合わせに依存した処理が挙げられます。例えばゲームの衝突判定で「弾丸 vs 壁」「弾丸 vs 敵」「爆発 vs 壁」それぞれで異なる処理が必要な場合、単一ディスパッチでは if/switch や訪問者パターンで迂回する必要があります。

多重ディスパッチを言語レベルでサポートしている例には次があります。

  • Julia:多重ディスパッチを中心概念として設計した科学計算言語で、型ごとにメソッドを定義して自動選択
  • Common Lisp(CLOS):ジェネリック関数で多重ディスパッチを実現
  • Clojure:multimethods として提供

C++やJavaでは言語機能として存在しないため、訪問者パターン(Visitor Pattern)で擬似的に実現するのが一般的なアプローチです。多重ディスパッチはコードの拡張性を高めますが、ディスパッチテーブルの規模が引数の型の組み合わせ数で爆発しうる点に注意が必要です。

使い方・例文

Juliaでは、同じ関数名 add(a, b) に対してa・bの型の組み合わせ(整数と整数、行列と行列など)ごとに別の実装を定義でき、呼び出し時に最適な実装が自動選択されます。

この用語をシェア

𝕏 でポスト LINE

最終更新:

関連用語