いろいろあってごちゃごちゃしてるので、整理するために処理に訪問してもらうために、VISITORクラスの依存関係を構築する。
ということで、まあ訪問先はAST(抽象構文木)ということになる。
今回はクラス図というより、acceptメソッドとvisitメソッドの関係性がわからないといけない
訪問先(Where to visit)に呼び名はない、NodeとかElementとか呼ばれる。
そして多重継承、ダブルディスパッチ
訪問者は訪問先を選べないが、訪問先の情報はわかるので、訪問先に応じて処理を変えることができる。訪問先もあらかじめ、状況に応じて訪問者を選ぶことができるので、結果多重ディスパッチが可能となる。
大切なのは選択肢
(おまけ)多重ディスパッチ詳細
LISPの例が分かりやすい。引数の順番で判断してメソッドの処理が変わるという。
宇宙船が小惑星にぶつかったときと、小惑星が宇宙船にぶつかったときと、宇宙船同士がぶつかったときと、小惑星同士がぶつかったときで、それぞれ計算がちがくね、でも関係してるのは宇宙船と小惑星しかなくね?ということらしい。
Juliaも同じような感じ。これを可能にしてくれるのがVisitorパターンという。