訪問者パターンに関連する他の質問を調べていましたが、訪問者パターンでの二重ディスパッチの実装を理解できませんでした。
リンクを参照してください ビジターパターン
訪問者パターンで二重ディスパッチはどのように機能しますか?
訪問者パターンに関連する他の質問を調べていましたが、訪問者パターンでの二重ディスパッチの実装を理解できませんでした。
リンクを参照してください ビジターパターン
訪問者パターンで二重ディスパッチはどのように機能しますか?
単発発送
Node がインターフェイス クラスであり、2 つのサブクラスがインターフェイスの具象実装であるとします。
ノード インスタンスでメソッドを呼び出す場合GenerateCode()
、実行される実際の操作はノードのタイプによって異なります。VariableRefNode
またはのいずれかのメソッドである可能性がありますAssignmentNode
。と呼んでも同じですPrettyPrint()
。したがって、実行される実際の操作は、呼び出しているメソッドの名前とノードのタイプによって異なります。
二重発送
今回は、と呼ばれるメソッドNode
に型のパラメーターを渡すことができます。プログラムでノード インスタンスを呼び出した場合、実行される実際の操作は、ノードのタイプ(または)と、渡したビジター インスタンスのタイプ(または)に依存します。NodeVisitor
Accept
Accept
VariableRefNode
AssignmentNode
Accept
TypeCheckingVisitor
CodeGeneratingVisitor
要素オブジェクトのaccept
メソッドはビジターオブジェクトを受け取り、ビジターオブジェクトのメソッドを呼び出しvisit
ます。ビジターオブジェクトにはいくつかのvisit
メソッドがあるため、要素タイプに基づいて適切なvisit
メソッドが呼び出されます。ここでは、要素と要素の正しい操作(タイプに基づく)を指定する2つの呼び出し(ダブルディスパッチ)があります。
さて、これがその記事からの関連する引用です:
ビジターは「ダブルディスパッチ」を実施。OO メッセージは通常、「単一のディスパッチ」を明示します。実行される操作は、要求の名前と受信者のタイプによって異なります。「ダブルディスパッチ」では、実行される操作は、リクエストの名前、および 2 つのレシーバーのタイプ (ビジターのタイプとそれが訪問する要素のタイプ) に依存します。
これは基本的に、異なる訪問者が同じタイプにアクセスでき、同じ訪問者が異なるタイプにアクセスできることを意味します。訪問者パターンを使用して実行される名前付き操作の効果は、訪問者と訪問者(二重ディスパッチ)に依存する場合があります。