Рассмотрим этот синтаксически правильный (?) Псевдокод:
class Event {
public:
virtual int getID() const = 0;
virtual int getSize() = 0;
virtual void* getData() = 0;
virtual void setData() = 0;
//(I cannot define data at this level 'cos I don't know what it is yet)
}
class SpecialEvent : class Event {
public:
virtual int getPGNID() const = 0;
int getSourceAddress() {return source_address;}
int setSourceAddress(int source_address) {this->source_address = source_address;}
protected:
int source_address;
}
template <typename T, typename E>
class EventWrapper : public E {
T data;
public:
static int EVENT_ID;
//implements everything in Event...EVENT_ID is assigned at runtime by some registry
}
class AnEvent : public EventWrapper<int, Event> {
//public methods specific to AnEvent...
}
class AnotherEvent : public EventWrapper<long, SpecialEvent> {
int getPGNID() const {static int ID = 10; return ID;}
}
class TheProcessingClass {
AnEvent event1;
AnotherEvent event2;
void process(Event& e);
void process(SpecialEvent& e);
void doSomething() {
process(event1); //should invoke process(Event&)
process(event2); //should invoke process(SpecialEvent&)
}
}
По сути, у меня есть класс-оболочка, который упаковывает данные типа T и наследует от некоторого типа E
(в данном случае Event
или SpecialEvent
) ...
Сначала я собирался создать два класса-обертки EventWrapper
и SpecialEventWrapper
, пока не выяснил, что оба класса будут иметь одинаковый код (до тех пор, покарасширялся от некоторого типа Event
)
Во-первых, это звучит как основанный на политике дизайн.Однако у Events
нет особого поведения ... они просто содержат некоторые данные ... Я злоупотребляю этим шаблоном?
Во-вторых, есть ли лучший способ сделать это?Я сильно упрощаю вещи здесь, но любые идеи будут оценены ...
РЕДАКТИРОВАТЬ Я обновил свой пример ... Короче говоря, классы обработки слушают события и должны приниматьдействие на основе события.Надеюсь, это поможет ...