複数のディスパッチの概念(つまり、仮想メソッドの動的ディスパッチがメソッドの引数にも拡張されているかのような組み込みサポート) をオブジェクト指向言語に含める必要があるかどうか疑問に思います。無視できる。
問題
次のシナリオを考えてみましょう: 動物の種類を含む (必ずしも平坦ではない) クラス階層があります。コード内のさまざまな場所で、動物オブジェクトに対していくつかのアクションを実行したいと考えています。このオブジェクト参照がどのように取得されるかは気にしませんし、制御することもできません。動物のリストをトラバースすることで遭遇するかもしれませんし、メソッドの引数の 1 つとして与えられるかもしれません。実行したいアクションは、特定の動物のランタイム タイプに応じて特化する必要があります。そのようなアクションの例は次のとおりです。
- GUI で表示するために、動物のビュー モデルを構築します。
- このタイプの動物を表すデータ オブジェクトを作成します (後で DB に格納します)。
- 動物にエサを与えますが、動物の種類に応じて異なる種類のエサを与えます (動物にとってより健康的なもの)。
これらの例はすべて動物オブジェクトのパブリック API で動作しますが、それらが行うことは動物自身のビジネスではないため、動物自体に組み込むことはできません。
ソリューション
1 つの「解決策」は、型チェックを実行することです。しかし、このアプローチはエラーが発生しやすく、リフレクション機能を使用します。これは (私の意見では) ほとんどの場合、設計が悪いことを示しています。型はコンパイル時の概念のみであるべきです。
もう 1 つの解決策は、ビジター パターンを「悪用」(一種) して、二重ディスパッチを模倣することです。しかし、これには、訪問者を受け入れるように動物を変更する必要があります。
他のアプローチがあると確信しています。また、拡張の問題にも対処する必要があります。新しいタイプの動物がパーティーに参加した場合、いくつのコード位置を適応させる必要があり、どうすればそれらを確実に見つけることができますか?
質問
では、これらの要件に照らして、適切に設計されたオブジェクト指向言語に複数ディスパッチを組み込むべきではないでしょうか?
特定のオブジェクトの動的タイプに依存する外部 (内部だけでなく) アクションを作成するのは自然なことではありませんか?
よろしくお願いします!