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?