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で大規模で複雑なライブラリを使用しており、Visitorパターンを非常にクリーンでクリーンな方法で広範囲に使用しています。特に、型消去という同じ問題に遭遇し、現在は解決されています。

機会があれば、私が書いた記事をご覧ください。

これは長い記事であり、Visitorパターンが概念的に何であるかを詳細に説明し、記事の最後の部分では、ポリモーフィズムと型消去を含む実際の例について説明します。

乾杯

于 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 に答える