5

在 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> //....
{

}

当然,由于类型擦除,这不起作用。(我想要这样的东西的原因是我将为可以访问的不同操作组提供不同的访问者界面。)

我想到的唯一解决方案是声明接口

public interface ActionAVisitor {
        void visitAction(ActionA action);    
    }
public interface ActionBVisitor {
        void visitAction(ActionB action);    
    }
//...

接着

public interface MySmallActionVisitor 
extends ActionAVisitor, ActionBVisitor
{

}

这会起作用,但我不喜欢所有 ActionXVisitor-Interfaces 的声明,这是愚蠢的重复和大量文件......

你有什么想法可以更好地做到这一点吗?

非常感谢!

4

3 回答 3

2

我使用 Java 中的一个庞大而复杂的库,它以非常干净整洁的方式广泛使用访问者模式。特别是,我遇到了同样的类型擦除问题,现在已经解决了。

如果你有机会,请看看我写的一篇关于这个的文章

这是一篇很长的文章,详细解释了访问者模式的概念,在文章的最后部分,讨论了一个涉及多态性和类型擦除的真实示例。

干杯

于 2011-01-29T23:15:09.353 回答
0

我将使用单个未参数化的访问者界面,然后在访问者方法中根据类型进行调度。

于 2010-12-29T06:34:47.703 回答
-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){

    }
}

}

于 2010-12-29T06:51:08.650 回答