20

訪問者パターンに関連する他の質問を調べていましたが、訪問者パターンでの二重ディスパッチの実装を理解できませんでした。

リンクを参照してください ビジターパターン

訪問者パターンで二重ディスパッチはどのように機能しますか?

4

4 に答える 4

55

単発発送

単発発送

Node がインターフェイス クラスであり、2 つのサブクラスがインターフェイスの具象実装であるとします。

ノード インスタンスでメソッドを呼び出す場合GenerateCode()、実行される実際の操作はノードのタイプによって異なります。VariableRefNodeまたはのいずれかのメソッドである可能性がありますAssignmentNode。と呼んでも同じですPrettyPrint()。したがって、実行される実際の操作は、呼び出しているメソッドの名前とノードのタイプによって異なります。

二重発送

ノード 訪問者

今回は、と呼ばれるメソッドNodeに型のパラメーターを渡すことができます。プログラムでノード インスタンスを呼び出した場合、実行される実際の操作は、ノードのタイプ(または)、渡したビジター インスタンスのタイプ(または)に依存します。NodeVisitorAcceptAcceptVariableRefNodeAssignmentNodeAcceptTypeCheckingVisitorCodeGeneratingVisitor

于 2012-10-03T06:18:07.770 に答える
21

要素オブジェクトのacceptメソッドはビジターオブジェクトを受け取り、ビジターオブジェクトのメソッドを呼び出しvisitます。ビジターオブジェクトにはいくつかのvisitメソッドがあるため、要素タイプに基づいて適切なvisitメソッドが呼び出されます。ここでは、要素と要素の正しい操作(タイプに基づく)を指定する2つの呼び出し(ダブルディスパッチ)があります。

于 2011-07-20T13:20:30.483 に答える
11

さて、これがその記事からの関連する引用です:

ビジターは「ダブルディスパッチ」を実施。OO メッセージは通常、「単一のディスパッチ」を明示します。実行される操作は、要求の名前と受信者のタイプによって異なります。「ダブルディスパッチ」では、実行される操作は、リクエストの名前、および 2 つのレシーバーのタイプ (ビジターのタイプとそれが訪問する要素のタイプ) に依存します。

これは基本的に、異なる訪問者が同じタイプにアクセスでき、同じ訪問者が異なるタイプにアクセスできることを意味します。訪問者パターンを使用して実行される名前付き操作の効果は、訪問者訪問者(二重ディスパッチ)に依存する場合があります。

于 2011-07-20T13:17:20.960 に答える