我做了类似于以下代码的事情:
void launchPipeline(IQueryFactory & queryFactory, IQuerySender &querySender, IValidateResponse &responseValidator)
{
std::unique_ptr<IQuery> query = queryFactory.getInstance();
/*
auto a,b,c = querySender.send(query);
//we just get a lot of params from that function
*/
if(responseValidator.validate(query, a, b, c)
{
//do something
}
}
class IValidateResponse
{
public:
virtual bool validate(IQuery & query, int a, int b, int c) = 0;
};
class QueryAValidator
{
public:
bool validate(IQuery & query, int a, int b, int c) override
{
const auto & queryA = dynamic_cast<const QueryA &>(query);
//do something
}
};
它工作得很好,因为IQueryFactory
和IValidateResponse
的匹配类型被注入。但我想知道是否可以用某种奇特的方式避免这种情况?
我在考虑QueryVisitor
,但我不确定如何实现它,访问函数需要使用a、b、c参数,这在IQuery
接口上看起来很奇怪,比如query.accept(visitor, a, b, c)
。
或者我可以将这些param存储在访问者中,但这仍然感觉不顺利,尤其是在编写测试时。现在我称之为";验证器测试";我只是简单地放置假响应并测试具体的Validator类,向其中添加访问者会使它们更加复杂。
你将如何解决这个问题?
在IQuery中定义一个纯虚拟函数,并将其称为foo(int a,int b,int c(。在QueryA中,您用您用"定义的代码覆盖foo//做某事;在动态铸造之后。用query.foo(a,b,c(替换动态强制转换