5
ビジターパターンのaccept()メソッドのポイントは何ですか?
アルゴリズムをクラスから切り離すことについては多くの話があります。しかし、説明されていないことが1つあります。 彼らはこのような訪問者を使用します abstract class Expr { public <T> T accept(Visitor<T> visitor) {visitor.visit(this);} } class ExprVisitor extends Visitor{ public Integer visit(Num num) { return num.value; } public Integer visit(Sum sum) { return sum.getLeft().accept(this) + sum.getRight().accept(this); } public Integer visit(Prod prod) { return prod.getLeft().accept(this) * prod.getRight().accept(this); } visit(element)を直接呼び出す代わりに、Visitorは要素にvisitメソッドを呼び出すように要求します。それは、訪問者についてのクラスの無意識の宣言された考えと矛盾します。 PS1あなた自身の言葉で説明するか、正確な説明を指摘してください。私が得た2つの応答は、一般的で不確実なものに言及しているためです。 PS2私の推測:getLeft()基本的なを返すのでExpression、呼び出すvisit(getLeft())と結果が得られますvisit(Expression)が、getLeft()呼び出すvisit(this)と別のより適切な訪問呼び出しが発生します。したがって、accept()型変換(別名キャスト)を実行します。 PS3 Scalaのパターンマッチング=ステロイドのビジターパターンは、acceptメソッドなしでビジターパターンがどれほど単純であるかを示しています。ウィキペディアはこの声明に次のように付け加えていaccept()ます。「リフレクションが利用できる場合はメソッドは不要であり、テクニックに「ウォークアバウト」という用語を導入している」という論文をリンクしています。