考虑以下语法上正确的(?)伪代码:
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没有任何特殊的行为...它们只是保存一些数据...我是否滥用了这种模式?
其次,有没有更好的方法来做到这一点?我在这里过于简化了事情,但任何见解将不胜感激...
编辑 我更新了我的示例...简而言之,处理类正在监听事件,并应根据事件采取行动。希望这有所帮助...