我有大量不同的对象,它们扩展了相同的基类A. 为了将不同的算法应用于集合,我创建了一个IVisitor接口,它为A的每个子节点都有一个Accept方法。
一些实施IVisitor的访问者实际上使用了A的所有孩子,但他们中的许多人都没有,所以我最终会让访问者有一堆我想避免的空(noop)方法。 此外,每次我添加A的新子类时,我需要向IVisitor添加一个新的Accept方法,并且 all 这些类实现它,这是访问者模式的常见问题。
我已尝试实施Selective Visitor pattern,但我不想在周围投放物品,因为这可能是个问题。
我还评估了this question,但其答案并非真正针对问题。我想使用接口而不是抽象类,因为在我的情况下不允许多重继承。
有没有办法避免这种麻烦并获得更清晰的代码?
编辑:您可以在此处找到Draw.io
上的示例答案 0 :(得分:1)
您可以为您的案例定义新模式;):“选择性通用访客”。 您的IVisit接口中只能有一个Visit方法接受带有从BaseClass继承的约束的泛型参数。
interface IVisitor<T> where T:BaseClass
{
void Visit(T element);
}
然后,具体访问者可以指定泛型参数并实现Visit方法。如果您可以利用Autofac之类的IoC容器,它可以作为泛型类型的工厂,您可以通过请求IVisitor并将其传递给Accept方法调用来轻松获取正确的Visitor实例。