2010-12-29 3 views
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-インタフェースの宣言を好きではないだろう210

これをより良くする方法はありますか?

ありがとうございます!

答えて

2

私は広範囲に非常にきれいで、きちんとした方法でVisitorパターンを使用してJavaで大規模かつ複雑なライブラリで動作します。特に、同じタイプの消去の問題が出てきて、今解決されています。

チャンスがあれば、an article I've written about thisをご覧ください。

Visitorパターンが概念的にどのようなものであるかを詳しく説明する長い記事です。記事の最後では、多態性や型の消去を含む実際の例が説明されています。

乾杯お待ちください

0

私は1つのパラメータ化されていない訪問者インターフェイスを使用し、visitorメソッド内では型に基づいてディスパッチを行います。

+0

"instanceof"を使用することを意味しますか?それはビジターパターンが避けたいものです。さらに、すべての訪問者(MySmallVisitor、MyFullVisitorなど)にブロックがある場合は、これらを記述する必要があります。 – Philipp

+0

はい、私はinstanceofを意味しました。それを回避しようとすると、最終的にはるかに多くのコードにつながる可能性があります。 –

+0

私が説明した問題を克服する方法が本当にない場合は、instanceofコードよりもコードがたくさんあると思います...悪い言語:-( – Philipp

-2

メソッド内部のインスタンスを回避する方法はありません。しかし、あなたはそれをより優雅にすることができます。

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){ 

    } 
} 

}

+0

あなたは訪問者のパターンについて聞いたことがありますか? http://en.wikipedia.org/wiki/Visitor_pattern#Java_example – Philipp

+0

嬉しい私は新しいことを学びました。 – LazyCubicleMonkey