Ho una classe   Message    che può contenere più tipi di payload (o talvolta nessun payload), ciascuno derivante da una comune classe   Payload   . Tuttavia, questo diventa problematico perché la classe   Message    vuole conoscere le sottoclassi   Payload    per vari motivi come: 
- 
Verifica dell'uguaglianza
Messageif (message parts besides the payload are equal) { switch(type) { case Payload::Type::RESPONSE: return *static_cast<ResponsePayload*>(payload.get()) == *static_cast<ResponsePayload*>(o.payload.get()); break; case Payload::Type::SETUP: return *static_cast<SetupPayload*>(payload.get()) == *static_cast<SetupPayload*>(o.payload.get()); break; ... } } - 
Deserializzazione (poiché i metodi di deserializzazione sono statici perché i carichi utili sono immutabili)
switch(type) { case Payload::Type::RESPONSE: load = ResponsePayload::fromJSON(payloadValue); break; case Payload::Type::SETUP: load = SetupPayload::fromJSON(payloadValue); break; ... case Payload::Type::START: case Payload::Type::STOP: case ...: break; // Load stays null default: THROW(Exception, "Error in program logic: we forgot to parse some payload"); } - 
Assicurati che
Payloadsia collegato aMessagedurante la costruzione:switch(type) { case Payload::Type::RESPONSE: case Payload::Type::SETUP: case ...: ENFORCE(IOException, payload != nullptr, "For this message type, a payload is required."); break; case Payload::Type::START: case Payload::Type::STOP: case ...: ENFORCE(IOException, payload == nullptr, "For this message type, the payload should be null"); break; default: THROW(Exception, "Error in program logic: we forgot to handle some payload"); } 
 I campanelli d'allarme stanno andando nella mia testa - questo viola  SOLID  come se non ci fosse domani e ovviamente non si adatta bene poiché devo aggiungere   case    dichiarazioni ogni volta che aggiungo un nuovo carico utile. C'è un approccio più pulito che potrei prendere?