2010-12-29 12 views
5

Ich beginne nach einigen Projekten in C# und C++ mit Java zu arbeiten. Besucher Schnittstellen wie diese entwerfenWie man Probleme mit der Typlöschung für die Besucherimplementierung löst

Ich wollte:

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

} 

Natürlich ist diese Löschung wegen Art nicht funktioniert. (Der Grund, warum ich so etwas wie dies wollen, ist, dass ich verschiedene Besucher Schnittstellen für verschiedene Gruppen von Aktionen haben, die besucht werden können.)

Die einzige Lösung, die mir in den Sinn kommt, ist Schnittstellen zu erklären

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

und dann

public interface MySmallActionVisitor 
extends ActionAVisitor, ActionBVisitor 
{ 

} 

Dies würde funktionieren, aber ich würde die Erklärung aller ActionXVisitor-Interfaces nicht wie die dumme Wiederholung und viele Dateien ist ...

Haben Sie Ideen, wie Sie das besser machen können?

Vielen Dank!

Antwort

2

Ich arbeite mit einer großen und komplexen Bibliothek in Java, die weitgehend das Besuchermuster in eine sehr sauberen und ordentlichen Art und Weise verwendet. Insbesondere stieß ich auf das gleiche Problem der Typauslöschung und es ist jetzt gelöst.

Wenn Sie eine Chance haben, sehen Sie sich bitte an article I've written about this.

Es ist ein langer Artikel, der ausführlich erklärt, was das Visitor-Muster konzeptuell ist, und im letzten Teil des Artikels wird ein Beispiel aus dem wirklichen Leben diskutiert, das Polymorphismus und Typlöschen beinhaltet.

Prost

0

Ich würde ein einziges nicht parametrisiertes Besucherinterface verwenden, dann innerhalb der Besuchermethode den Versand basierend auf Typ.

+0

meinen Sie mit "instanceof"? Das möchte das Besuchermuster vermeiden. Außerdem müsste ich diese Blöcke in jedem Besucher schreiben (MySmallVisitor, MyFullVisitor und andere). – Philipp

+0

ja, ich meinte instanceof. Der Versuch, dies zu vermeiden, wird am Ende wahrscheinlich zu viel mehr Code führen. –

+0

Wenn es wirklich keine Möglichkeit gibt, das Problem zu lösen, beschreibe ich, dass ich lieber mehr Code als instanceof code hätte ... Schlechte Sprache :-( – Philipp

-2

Es gibt keine Möglichkeit, instanceof innerhalb der Methode vermeiden zu können. Aber man kann es anmutiger machen:

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

Entschuldigung, hast du jemals von dem Besuchermuster gehört? Natürlich ist es möglich, es zu vermeiden http://en.wikipedia.org/wiki/Visitor_pattern#Java_example – Philipp

+0

Ich bin froh, dass ich etwas Neues gelernt habe. – LazyCubicleMonkey