考虑以下层次结构:
class Base
{
virtual void Method() = 0;
virtual void Accept(Visitor *iVisitor) = 0;
};
class Derived1: public Base
{
virtual void Method(){//impl}
virtual void Accept(Visitor *iVisitor)
{
iVisitor->Visit(this);
}
};
class Derived2: public Base
{
virtual void Method(){//impl}
virtual void Accept(Visitor *iVisitor)
{
iVisitor->Visit(this);
}
};
和访客类:
class VisitorInterface
{
virtual void Visit(Derived1 * param);
virtual void Visit(Derived2 * param);
}
class Visitor: public VisitorInterface
{
void Visit(Derived1 * param){}
void Visit(Derived2 * param){}
}
通常当重载方法依赖于参数类型时,我使用访问者模式来实现双重调度,但我只有指向基类的指针。
例如:
void foo(Visitor *visitorPtr, Base * basePtr)
{
basePtr->Accept(visitorPtr);
}
我认为这是实现双重调度的唯一方法,因为虚拟函数的动态绑定应该只发生在调用方法的对象上,而不是其参数(派生类型)上。
现在我遇到了一个新情况,我需要一种在多个参数上重载的 Visit 方法。像这样的东西:
class VisitorInterfaceMultiple
{
virtual void Visit(Derived1 * param1, Derived2 * param2);
virtual void Visit(Derived2 * param1, Derived3 *param2);
}
我不能使用经典的访问者模式解决方案,因为仅在其中一个参数上调用了接受方法。
我的问题是:是否存在任何类似的访问者模式解决方案或类似的东西,我可以在这种情况下使用?(我需要用确切的 2 个参数重载 Visit,不超过 2 个)。