私はC++でイベント処理に取り組んでおり、イベントの通知を処理するために、イベントを生成するクラスが継承できるクラスEventGeneratorがあります。EventGenerator には、他のクラスがコールバックに追加するために使用できるメソッドと、イベントが発生したときにコールバックを呼び出すメソッドがあります。
さまざまなタイプのイベントの通知を処理するために、テンプレート タイプ T で EventGenerator をパラメーター化しました。通知クラスは、さまざまなタイプでパラメーター化された EventGenerator から複数回継承できます。
完全を期すために、EventGenerator のコードを次に示します。
#ifndef _EventGenerator
#define _EventGenerator
#include <list>
#include "EventListener.h"
template <class Event>
class EventGenerator {
private:
std::list<EventListener<Event>*> listeners;
protected:
EventGenerator() {}
void changeEvent(Event event) {
std::list<EventListener<Event>*>::const_iterator it = listeners->begin();
for (; it != listeners->end(); it++) {
(*it)->changeEvent(event);
}
}
public:
void addListener(EventListener<Event>* listener) {
listeners->push_back(listener);
}
};
#endif
そして、コールバックを追加したいクラスが継承する EventListener のコードは次のとおりです-
#ifndef _EventListener
#define _EventListener
template <class Event>
class EventListener {
private:
EventListener(const EventListener<Event>& event);
protected:
EventListener() {}
public:
virtual void changeEvent(Event event) = 0;
};
#endif
これはあまり良いデザインではないと感じており、そのような問題に対してより良いデザインがあるかどうか疑問に思っていました.
編集:気になるのは、多重継承を使用しているという事実です。頻繁に使用しないように警告されてきたので、そのような設計が将来悪いことが起こる可能性があるかどうかについての意見が欲しかったのでしょう。
ありがとう