Design patterns 如何避免访问者模式实现的empty(noop)方法?
我有大量不同的对象,它们扩展了相同的基类a。 为了对集合应用不同的算法,我创建了一个IVisitor接口,该接口为集合的每个子级都有一个Accept方法 一些实现IVisitor的访问者实际上使用了A的所有子级,但其中许多没有,因此我最终让访问者使用了一堆我希望避免的空(noop)方法。 此外,每次我添加一个新的子类时,我都需要向IVisitor添加一个新的Accept方法,并且all类实现它,这是访问者模式的常见问题 我已经尝试实现了,但我不喜欢四处投射对象,因为在我的例子中,这可能是一个问题 我也进行了评估,但其答案并非真正针对问题。我希望使用接口而不是抽象类,因为在我的情况下不允许多重继承 有没有办法避免这种麻烦并获得更干净的代码Design patterns 如何避免访问者模式实现的empty(noop)方法?,design-patterns,Design Patterns,我有大量不同的对象,它们扩展了相同的基类a。 为了对集合应用不同的算法,我创建了一个IVisitor接口,该接口为集合的每个子级都有一个Accept方法 一些实现IVisitor的访问者实际上使用了A的所有子级,但其中许多没有,因此我最终让访问者使用了一堆我希望避免的空(noop)方法。 此外,每次我添加一个新的子类时,我都需要向IVisitor添加一个新的Accept方法,并且all类实现它,这是访问者模式的常见问题 我已经尝试实现了,但我不喜欢四处投射对象,因为在我的例子中,这可能是一个问题
编辑:这里有一个例子,你可以定义一个新的模式;)对于您的案例:“选择性普通访客”。 在IVisit接口中只能有一个Visit方法,该方法接受从基类继承的带有约束的泛型参数
interface IVisitor<T> where T:BaseClass
{
void Visit(T element);
}
接口IVisitor,其中T:BaseClass
{
无效访问(T元素);
}
然后,具体的访问者可以指定泛型参数并实现访问方法。如果您可以利用IoC容器,例如,它可以作为泛型类型的工厂,您可以通过请求IVisitor轻松获得适当的访问者实例,并将其传递给接受方法调用。您可以定义一个新模式;)对于您的案例:“选择性普通访客”。 在IVisit接口中只能有一个Visit方法,该方法接受从基类继承的带有约束的泛型参数
interface IVisitor<T> where T:BaseClass
{
void Visit(T element);
}
接口IVisitor,其中T:BaseClass
{
无效访问(T元素);
}
然后,具体的访问者可以指定泛型参数并实现访问方法。如果您可以利用IoC容器,例如,它是泛型类型的工厂,您可以通过请求IVisitor轻松获得适当的访问者实例,并将其传递给接受方法调用。您能提供一个示例代码来澄清您的问题吗?@MohammadaminKhayat我链接了一个UML图,提供了接口中所有Visit()方法的默认实现,什么都不做(或者更好,抛出异常)。您使用的是哪种语言?@JBNizet这不可行,因为我使用的语言不支持多重继承,因此接口必须是接口,不是一个类为什么不告诉我们你在使用哪种语言?你能提供一个示例代码来澄清你的问题吗?@MohammadMinkhayat我链接了一个UML图,提供了接口中所有Visit()方法的默认实现,什么都不做(或者更好,抛出一个异常)。您使用的是哪种语言?@JBNizet这不可行,因为我使用的语言不支持多重继承,因此接口必须是接口,而不是类。为什么不告诉我们您使用的是哪种语言?