大量の訪問者コードを記述せずに、静的/厳密に型指定された方法でC#のメソッドをマルチディスパッチするにはどうすればよいですか?
私はそのためのテクニックを知りません。
C#で記述されたRoslynバージョンのC#コンパイラでは、数十または数百のメンバーを持つ型階層で、あらゆる場所でビジターパターンを使用します。型のXML記述を、訪問者の基本クラスとともに型の宣言に変換するユーティリティを作成しました。それは私たちにとって非常にうまくいくようです。
このコードを生成するツール/拡張機能はありますか?
がある; 自分で書いた。難しくはありませんでした。あなたは同じことをすることができます。
言語としてのC#に、マルチディスパッチの問題に対処するものがないのはなぜですか?
私たちはあなたの腕より文字通り長い可能な言語機能のリストを持っています。どのリリースでも、2つか3つ、トップスを実行する予算があります。したがって、可能な限りの利益を得ることに集中します。
ビジターパターンの自動生成を介して二重(または複数)の仮想ディスパッチを簡単に実装できるようにすることで、そのリストの一番上に近づくことはありませんでした。私たちが言語に埋め込むことができる他の可能なパターンは文字通り何十もありますが、それはより「大金を稼ぐ」ものです。人気のある言語の調査を行うと、静的分析による二重または複数の仮想ディスパッチをサポートする言語はごくわずかであり、それほど人気がない言語であることがわかります。それには理由があります。1つは、実際にはあまり便利な機能ではないためです。2つ目は、必要なときにパターンを自分で実装するか、動的ディスパッチを使用することで実現できるためです。
お気づきのように、パターンベースのアプローチと動的ディスパッチアプローチの両方に重大な欠点があります。ただし、欠点はありますが、どちらも通常の基幹業務開発者が必要に応じて自分で実装することは可能です。言語に埋め込むパターンを評価するときは、通常の開発者がパターンベースのアプローチを使用して自分自身を実装するのが非常に難しいパターンに傾倒します。ビジターパターンは難しくありません。それはただ冗長です。
例:C#2では、言語に「シーケンスジェネレーター」パターンを埋め込むことを選択しました。C#3では、「シーケンスモナドを使用したクエリ内包表記」パターンを言語に埋め込むことを選択しました。C#4では、「動的ディスパッチ」パターンを言語に埋め込むことを選択しました。C#5では、「現在の継続をデリゲートとして渡す」パターンを言語に埋め込むことを選択しました。これらはすべて、ビッグバンの例です。実装するには費用のかかる機能でしたが、基本的には、コア言語で新しいスタイルのプログラミングを利用できるようにします。
どのリリースでも利用できる作業は限られています。リリースの言語に1つのパターンを埋め込むと、そのリリースの言語に他のパターンを埋め込むことができなくなります。これは、それを行うための予算がないためです。
「ダブル(またはマルチ)仮想ディスパッチ」パターンを言語に埋め込むことが、予算を使うための最良の方法になる場合、それを実行します。以前は実行しませんでした。したがって、長い待ち時間を期待する必要があります。