面试可以让人重新点燃学习的热情,尽管目的性比较强,但是客观上的确学习到了东西。在一次面试中发现自己又搞混了override和overload。
在Visitor设计模式中也是要特别注意overload和override的。很多人可能会写出如下的Visitor代码
输出结果是“Node Node Node”,显然这不是你想要的。为什么会这样呢?这在于visitor.visit(this)这行代码,所谓的动态调用(override)指的是visitor会调用被override的方法,但是显然visitor提供了三个函数,分别对应Node, SimpleNode, ComplexNode三种参数。具体调用哪个呢?其实this指的是Node类型,所以调用的是Node对应的函数,结果输出都是“Node“。我们需要修改的就是按照Visitor模式中的方法,给每种Node都加上一个accept方法,使得this指向正确的类型。这也是Visitor模式被人诟病的一个地方。另一个讨厌的地方就是,增加一个Node子类,必须在Visitor中增加一个visit方法。据说Visitor模式刚进入中国的时候,没有几个人能懂。现在想来还是很容易理解的,因为要真正懂的现在也未必有很多人。不信你可以解释一下Visitor中的每个元素作用,尤其是看过书之后一年再来解释,如果还能够正确讲出来,说明你是理解了而不是背下来。