关于Visitor的疑问,欢迎讨论
在Visitor的实现方式中,接受访问的对象使用accept(Visitor inVisitor)来接受访问者,在该方法中使用这么一句:inVisitor.Visit(this),把自己当作参数传给访问者。这样当accept方法接受不同的访问者时,就可以实现不同的操作。
我的疑问是当调用accept方法的时候,该方法只是把自己当作参数传给了Visitor,那么为什么不直接调用Visitor的Visit方法呢。例如这样,Visitor.visit(new Accepter),如此以来就可以省accept方法。我的理解是,可以在accept方法中做一些准备工作,不过之后自己马上又推翻了这个想法,因为如果有什么工作要做的话可以放到visit方法的方法体中去做。这个问题一直在困扰着我。这里并不是要研究茴字的四种写法,只是觉得既然Gof这么做的,我希望能弄明白其中的道理。希望大家都能提提自己的看法。
[解决办法]
你要注意到,你使用Visitor.visit(acceptor)的时候,acceptor的类型是Gladiolus、Runuculus和Chrysanthemum的基类/接口。编译器不知道该隐式转换成哪一个类型。你希望利用重载来使调用简单一些,但是重载是利用了编译器的隐式类型转换的能力的。
如果你能把上面的代码运行一下,你就知道你想的不对了。