2010-12-29 10 views
5

Estoy empezando a trabajar con Java después de algunos proyectos en C# y C++.Cómo superar el problema con el borrado de tipo para la implementación de visitante

que quería diseñar interfaces de visitantes así:

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

} 

Por supuesto, esto no funciona porque el tipo de borrado. (La razón por la que quiero algo como esto es que voy a tener diferentes interfaces de Visitante para diferentes grupos de acciones que se pueden visitar.)

La única solución que se me viene a la mente es declarar interfaces de

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

y luego

public interface MySmallActionVisitor 
extends ActionAVisitor, ActionBVisitor 
{ 

} 

Esto funcionaría, pero no me gustaría la declaración de todas las interfaces ActionXVisitor que es la repetición estúpida y un montón de archivos ...

¿Tiene alguna idea de cómo hacerlo mejor?

¡Muchas gracias!

Respuesta

2

trabajo con una biblioteca grande y complejo en Java, que utiliza ampliamente el patrón del visitante de una manera muy limpia y ordenada. En particular, me encontré con el mismo problema de borrado de tipo y ahora está resuelto.

Si tiene la oportunidad, por favor, eche un vistazo al an article I've written about this.

Es un artículo largo, que explica en detalle de qué se trata conceptualmente el patrón Visitor y, en la última parte del artículo, se discute un ejemplo de la vida real que implica polimorfismo y borrado de tipos.

Cheers

0

Usaría una única interfaz de visitante sin parametrizar, luego, dentro del método de visitante haré el despacho según el tipo.

+0

quieres decir con "instanceof"? Eso es lo que el patrón de visitante quiere evitar. Además, tendría que escribir estos bloques si en cada visitante (MySmallVisitor, MyFullVisitor y otros). – Philipp

+0

sí, quise decir instanceof. intentar evitarlo, probablemente conducirá a mucho más código al final. –

+0

si realmente no hay manera de superar el problema que describí, prefiero tener más código que código de instancia ... Lenguaje deficiente :-( – Philipp

-2

No hay manera de poder evitar una instancia dentro del método. Pero se puede hacer más elegante:

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

lo siento, ¿alguna vez has oído hablar del patrón de visitante? Por supuesto, es posible evitarlo . http://en.wikipedia.org/wiki/Visitor_pattern#Java_example – Philipp

+0

Contento de haber aprendido algo nuevo. – LazyCubicleMonkey

Cuestiones relacionadas