-2

访问者设计模式的接受方法是否可以由类层次结构的根实现?

4

4 回答 4

1

我想说的是,如果 Java 只允许您accept在基类中实现一次,那么这一事实将破坏 Visitor 的全部目的,对于 Java 和其他类似语言中缺少的多次调度来说,这是一个非常麻烦的解决方法。

于 2012-05-13T21:45:21.043 回答
0

从某种意义上说,是的,但是正确的访问者实现将要求您的基类实现有一个 if 链来检查基类的哪个子类this是一个实例,因为正如其他人指出的那样,访问者模式是为了实现类似多次分派的东西,这需要以某种方式区分对象的运行时类型。即,您要么以“正确”的方式实现访问者,accept()在每个子类中都可以分派一个,或者您accept()在层次结构的根部实现一个大的,如下所示:

public void accept(Visitor visitor) {
    if (this instanceof Foo) {
        doSomething();
    } else if (this instanceof Bar) {
        doSomethingElse();
    } else ...
}

不是很漂亮,嗯?它违反了各种设计原则,包括适当的多态设计,这是访问者和多次调度的重点,所以再想一想,我认为调用那个访问者根本就有点牵强。

于 2012-05-13T22:04:55.320 回答
0

你可以在基类中实现accept方法,但是你不能实现任何其他类,因为你只能扩展一个类,你不想因为你不想复制一个简单的单行函数而浪费它

于 2017-01-09T10:43:54.920 回答
-1

在 Java 中这是不可能的,因为编译器不知道要绑定到什么方法。(某些语言具有基于对象的实际运行时类的动态方法绑定,但 Java 没有。)

于 2012-05-13T21:30:11.873 回答