Questo sarà in C ++ 11, ma la progettazione dell'oggetto dovrebbe essere piuttosto agnostica.
Ho 3 classi di interfaccia, IEvent , ICondition , IRunnable .
Il ciclo principale elabora più tipi di IEvent , che vanno da "un'applicazione lanciata" a "Posizione utente cliccata (x, y)". Quindi per ogni tipo di evento, una lista di ICondition viene notificata attraverso un'interfaccia listener. Ad esempio, ConditionUserClickedPos implementa IEventClickListener::onClick(int x, int y) , che viene chiamato dal ciclo principale.
Se la posizione è all'interno delle condizioni, uno o più oggetti IRunnable vengono richiamati tramite IRunnable::execute(IEvent triggeringEvent) , come class RunnableDrawCircleAtClickPosition e class RunnableShowPrettyWindow .
Il mio problema è il seguente:
Nell'implementazione IRunnable::execute(IEvent triggeringEvent) , ho bisogno di ottenere le informazioni precise dell'evento, ma non conosco la gerarchia di classi esatta dell'evento di trigger.
Questo può essere facilmente risolto con dynamic_cast, controllando i metodi typeid o altri metodi oop riflettenti, ma quelli di solito generano un codice piuttosto puzzolente. Sto anche cercando di mantenere il codice estendibile per eventi, condizioni e runnables nuovi e non correlati di cui ancora non so nulla.
Potrei anche dichiarare una serie di sovraccarichi per ::execute(...) in base ai tipi di classi per bambini, ma anche questo non sembra corretto.
C'è un proiettile d'argento che ho perso qui?