Considere esto sintácticamente correcta pseudocódigo (?):¿Es este un uso apropiado del polimorfismo?
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&)
}
}
Esencialmente, tengo una clase contenedora que envuelve los datos de tipo T y hereda de algún tipo de E
(en este caso Event
o SpecialEvent
) ...
que inicialmente iba a crear dos clases contenedoras EventWrapper
y SpecialEventWrapper
hasta que me di cuenta de que ambas clases tendrían exactamente el mismo código en el mismo (siempre que se extiende desde algún tipo de Event
)
En primer lugar, esto suena como un diseño basado en políticas. Sin embargo, el Events
no tiene ningún comportamiento especial ... solo contienen algunos datos ... ¿Estoy abusando de este patrón?
En segundo lugar, ¿hay una mejor manera de hacerlo? Estoy simplificando mucho las cosas aquí, pero será apreciado ningún indicio ...
EDITAR He actualizado mi ejemplo ... en definitiva, las clases de procesamiento están escuchando para Eventos y deben tomar medidas basadas en el Evento . Espero que esto ayude ...
+1 para "pseudocódigo sintácticamente correcto" =) – fouronnes