Considera l'esempio di seguito. Qualsiasi modifica all'enumerazione ColorChoice influisce su tutte le sottoclassi IWindowColor.
Gli enum tendono a causare interfacce fragili? C'è qualcosa di meglio di un enum per consentire una maggiore flessibilità polimorfica?
enum class ColorChoice
{
Blue = 0,
Red = 1
};
class IWindowColor
{
public:
ColorChoice getColor() const=0;
void setColor( const ColorChoice value )=0;
};
Modifica: scusate per aver usato il colore come mio esempio, non è questo il problema. Ecco un esempio diverso che evita l'aringa rossa e fornisce maggiori informazioni su cosa intendo per flessibilità.
enum class CharacterType
{
orc = 0,
elf = 1
};
class ISomethingThatNeedsToKnowWhatTypeOfCharacter
{
public:
CharacterType getCharacterType() const;
void setCharacterType( const CharacterType value );
};
Inoltre, immagina che le maniglie per la sottoclasse ISomethingThatNeedsToKnowWhatTypeOfCharacter appropriata siano distribuite da un modello di progettazione di fabbrica. Ora ho un'API che non può essere estesa in futuro per un'applicazione diversa in cui i tipi di caratteri consentiti sono {umano, nano}.
Modifica: solo per essere più concreti su ciò su cui sto lavorando. Sto progettando un forte legame di questa specifica ( MusicXML ) e sto usando le classi enum per rappresentare quei tipi nella specifica che sono dichiarati con xs: enumeration. Sto cercando di pensare a cosa succede quando esce la prossima versione (4.0). La mia libreria di classi potrebbe funzionare in modalità 3.0 e 4.0? Se la prossima versione è compatibile al 100% con le versioni precedenti, forse. Ma se i valori di enumerazione fossero rimossi dalle specifiche, allora sarei morto nell'acqua.