2010-12-29 10 views
5

Zaczynam pracować z Javą po niektórych projektach w C# i C++.Jak pokonać problem z typem wymazania dla implementacji gościa

chciałem projektować interfejsy gości tak:

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

} 

Oczywiście to nie działa, ponieważ typu skasowaniem. (Powodem, dlaczego chcę coś takiego jest, że będę mieć różne interfejsy odwiedzających dla różnych grup działania, które można zwiedzać.)

Jedynym rozwiązaniem, które przychodzi mi na myśl to zadeklarować interfejsów

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

a następnie

public interface MySmallActionVisitor 
extends ActionAVisitor, ActionBVisitor 
{ 

} 

to będzie działać, ale nie chciałbym deklarację wszystkich ActionXVisitor interfejsy, które jest głupie powtórzeń i wiele plików ...

Czy masz jakieś pomysły, jak to zrobić lepiej?

Wielkie dzięki!

Odpowiedz

2

pracuję z dużym i złożonym biblioteki w Javie, które intensywnie używa odwiedzający w bardzo czysty i schludny sposób. W szczególności natknąłem się na ten sam problem z wymazaniem typu i jest on teraz rozwiązany.

Jeśli masz szansę, zapoznaj się z an article I've written about this.

To długi artykuł, który wyjaśnia szczegółowo, czym jest koncept Visitor, a na końcu artykułu omawiany jest przykład życia, który obejmuje polimorfizm i wymazywanie typu.

Pozdrawiam

0

Korzystałbym z pojedynczego nieparametrycznego interfejsu użytkownika, a następnie w metodzie odwiedzającej, należy wykonać wysyłkę na podstawie typu.

+0

Masz na myśli użycie "instanceof"? Właśnie tego wzór odwiedzający chce uniknąć. Ponadto musiałbym napisać je, jeśli bloki w każdym odwiedzającym (MySmallVisitor, MyFullVisitor i inne). – Philipp

+0

tak, miałem na myśli instanceof. próba uniknięcia tego, prawdopodobnie doprowadzi w końcu do znacznie większej ilości kodu. –

+0

jeśli naprawdę nie ma sposobu na przezwyciężenie problemu, który opisałem, wolałbym mieć więcej kodu niż kodu instancji ... Słaby język :-( – Philipp

-2

Nie ma sposobu na uniknięcie wystąpienia metody wewnątrz metody. Ale można uczynić go bardziej wdzięczne:

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

Przepraszam, czy kiedykolwiek słyszałeś o wzorzec odwiedzającego? Oczywiście można tego uniknąć http://en.wikipedia.org/wiki/Visitor_pattern#Java_example – Philipp

+0

Cieszę się, że nauczyłem się czegoś nowego. – LazyCubicleMonkey

Powiązane problemy