シングルディスパッチの問題は、JavaやC#などの静的に型指定された言語を使用したコーディングに従事する人々にはほとんどよく知られています。基本的な考え方は次のとおりです。
receiver
実行時ポリモーフィズムにより、たとえば次のタイプ(実行時タイプ)に応じて適切なメソッド呼び出しにディスパッチできます。
IAnimal mything = new Cat();
mything.chop();
mything
メソッド呼び出しは、の実行時型、つまり。に従って実行されますCat
。これはシングルディスパッチ機能です(Java / C#に存在します)。
ここで、ランタイムタイプのレシーバーだけでなく、(複数の)引数のタイプでもディスパッチする必要がある場合は、少し問題が発生します。
public class MyAcceptor {
public void accept (IVisitor vst) {...}
public void accept (EnhancedConcreteVisitor vst) {...}
}
2番目のメソッドは呼び出されません。これは、「consumer」コードでは、さまざまなタイプのオブジェクト(私の例では訪問者)を共通のスーパータイプまたはインターフェイスで処理する傾向があるためです。
動的型付けでは多重ディスパッチポリモーフィズムが可能であり、C#4.0にはその動的キーワードがあるためです;)