这只是项目中较大遗留代码的最小版本,其中访问者模式定义如下: -
struct AbstractElement;
struct FirstElement;
struct SecondElement;
struct ThirdElement;
struct AbstractVisitor{
virtual void visit(FirstElement&) = 0;
virtual void visit(SecondElement&) = 0;
virtual void visit(ThirdElement&) = 0;
};
struct AbstractElement{
virtual void accept(AbstractVisitor* v) = 0;
};
struct FirstElement : public AbstractElement{
void accept(AbstractVisitor* v) { v->visit(*this); }
}
struct SecondElement : public AbstractElement{
void accept(AbstractVisitor* v) { v->visit(*this); }
};
struct ThirdElement : public AbstractElement{
void accept(AbstractVisitor* v){ v->visit(*this); }
};
struct Visitor : public AbstractVisitor{
void visit(FirstElement& p){ process(p); }
void visit(SecondElement& p){ process(p); }
void visit(ThirdElement& p){ process(p); }
virtual void process(AbstractElement& b){/* some processing common to every concrete element */ }
};
我无法理解的代码部分是为什么此代码的编写者将AbstractVisitor类定义为: -
struct AbstractVisitor{
virtual void visit(FirstElement&) = 0;
virtual void visit(SecondElement&) = 0;
virtual void visit(ThirdElement&) = 0;
};
而不是像以下那样定义: -
struct AbstractVisitor{
virtual void visit(AbstractElement&) = 0;
};
按照作者定义的方式定义类是否有任何好处?