Alternativa espandibile al pattern Visitor per l'attraversamento di alberi?

2

Ho un albero contenente vari sottotipi della mia classe di nodo base. Ora voglio attraversare questo albero e fare qualcosa con i nodi a seconda del loro tipo.

L'idea più semplice è quella di definire un metodo doSomething nella mia classe nodo base, ma questo significa che per aggiungere funzionalità devo aggiungere un metodo a tutti i sottotipi di nodi esistenti.

La prima cosa che viene in mente per risolvere questo è il pattern Visitor. Tuttavia, voglio essere in grado di creare nuovi sottotipi senza dover cambiare tutti i visitatori esistenti - Voglio che i nuovi sottotipi ereditino il modo in cui vengono gestiti dal loro tipo di base.

Penso che usare dynamic_cast dovrebbe fare il trucco, ma ho capito che è un'operazione costosa, e sarà chiamata molto, quindi non è una buona soluzione. E molte persone dicono che è un segno di cattiva progettazione, anche se in questo caso non vedo il problema.

In questo momento sto usando la prima soluzione perché vedo prevedere molti più tipi aggiunti di funzionalità, ma c'è un modo migliore per farlo ?

    
posta Oebele 18.06.2015 - 19:57
fonte

1 risposta

3

I want the new subtypes to inherit the way they are handled from their base type

Il classico pattern visitatore GOF si comporta esattamente in questo modo. Ad esempio, guarda l' esempio di Wikipedia CarElement (è un esempio Java, ma la parte importante è simile in C ++ ). Supponiamo che tu aggiunga nuovi tipi di Ruota come SquareWheel , RoundWheel ereditandoli da Wheel . Quindi, visit(Wheel &wheel) elaborerà SquareWheel e RoundWheel , purché non definisci alcun metodo visit(SquareWheel &wheel) o visit(RoundWheel &wheel) .

    
risposta data 18.06.2015 - 22:01
fonte

Leggi altre domande sui tag