在C#和C ++中的一些项目之后,我开始使用Java。
我想设计这样的访问者界面:
public interface ActionVisitor<A> {
void visitAction(A action);
}
public interface MySmallActionVisitor
extends ActionVisitor<ActionA>,
ActionVisitor<ActionB>
{
}
public interface MyFullActionVisitor
extends ActionVisitor<ActionA>,
ActionVisitor<ActionB>,ActionVisitor<ActionC>,ActionVisitor<ActionD> //....
{
}
当然,由于类型擦除,这不起作用。 (我之所以想要这样的东西,是因为我可以访问不同的Actions组,我会有不同的Visitor接口。)
我想到的唯一解决方案是声明接口
public interface ActionAVisitor {
void visitAction(ActionA action);
}
public interface ActionBVisitor {
void visitAction(ActionB action);
}
//...
然后
public interface MySmallActionVisitor
extends ActionAVisitor, ActionBVisitor
{
}
这样可行,但我不喜欢所有ActionXVisitor-Interfaces的声明,这是愚蠢的重复和大量的文件......
你有什么想法如何更好地做到这一点?
非常感谢!
答案 0 :(得分:2)
我使用Java中的大型复杂库,它以非常干净整洁的方式广泛使用访问者模式。特别是,我遇到了类型擦除的相同问题,现在已经解决了。
如果有机会,请查看an article I've written about this。
这是一篇很长的文章,详细解释了访问者模式在概念上的含义,在本文的最后部分,讨论了一个涉及多态和类型擦除的现实生活中的例子。
干杯
答案 1 :(得分:0)
我会使用一个未参数化的访问者界面,然后在访问者方法内部根据类型进行调度。
答案 2 :(得分:-2)
无法避免方法内部的instanceof。但你可以使它更优雅:
public interface MarkerInterface{}
public interface ActionVisitor<T extends MarkerInterface> {
void visitAction(T action);}
public class A implements MarkerInterface{}
public class B implements MarkerInterface{}
public class MySmallActionVisitor implements ActionVisitor<MarkerInterface>{
@Override
public void visitAction(MarkerInterface action) {
if(action instanceof A){
}
else if(action instanceof B){
}
}
}