Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 如何避免访问者模式实现的empty(noop)方法?_Design Patterns - Fatal编程技术网

Design patterns 如何避免访问者模式实现的empty(noop)方法?

Design patterns 如何避免访问者模式实现的empty(noop)方法?,design-patterns,Design Patterns,我有大量不同的对象,它们扩展了相同的基类a。 为了对集合应用不同的算法,我创建了一个IVisitor接口,该接口为集合的每个子级都有一个Accept方法 一些实现IVisitor的访问者实际上使用了A的所有子级,但其中许多没有,因此我最终让访问者使用了一堆我希望避免的空(noop)方法。 此外,每次我添加一个新的子类时,我都需要向IVisitor添加一个新的Accept方法,并且all类实现它,这是访问者模式的常见问题 我已经尝试实现了,但我不喜欢四处投射对象,因为在我的例子中,这可能是一个问题

我有大量不同的对象,它们扩展了相同的基类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这不可行,因为我使用的语言不支持多重继承,因此接口必须是接口,而不是类。为什么不告诉我们您使用的是哪种语言?