Ho un gestore di eventi. Riceve un evento e deve fare un po 'di lavoro su di esso. Questo lavoro è suddiviso tra lavoro comune - cose che devono essere fatte per tutti i tipi di gestori di eventi - e lavoro specifico - cose che devono essere fatte solo per una specifica app.
Sembra che ci siano due approcci per implementare questo progetto. Potrei scrivere una funzione membro non virtual
, che richiama una funzione membro% purevirtual
chiamata in modo diverso:
struct Base {
virtual ~Base() = default;
void onEvent(Event const& ev) {
// do common stuff
onEventImpl(ev);
}
protected:
virtual void onEventImpl(Event const& ) = 0;
};
oppure, potrei avere una sola funzione membro virtual
e fare affidamento sulle classi derivate per chiamare sempre prima la classe Base:
struct Base {
virtual ~Base() = default;
virtual void onEvent(Event const& ev) {
// do common stuff
}
};
struct Derived : Base {
void onEvent(Event const& ev) override {
Base::onEvent(ev);
// do specific stuff
}
};
Il primo è sicuro, ma implica il fatto che due di queste funzioni abbiano lo stesso nome.
Quest'ultimo è soggetto a errori in quanto le classi derivate potrebbero dimenticare di chiamare la classe base (anche se questo errore sarebbe evidenti dalla prima prova - non il tipo di errore sottile che potrebbe strisciare su di voi), ma a Almeno abbiamo solo la funzione onEvent()
.
Qual è l'approccio giusto per risolvere questo problema? C'è un'opzione migliore di questi due?