Considera l'esempio qui sotto. Qualsiasi modifica all'enumerazione ColorChoice interessa tutte le sottoclassi di IWindowColor.
Le enumerazioni 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: mi dispiace per aver usato il colore come esempio, non è di questo che si tratta. Ecco un altro esempio che evita le aringhe rosse 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 sottoclassi appropriate di ISomethingThatNeedsToKnowWhatTypeOfCharacter vengano 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 {human, dwarf}.
Modifica: solo per essere più concreti su ciò su cui sto lavorando. Sto progettando una strong associazione di questa ( MusicXML ) specifica e sto usando le classi enum per rappresentare quei tipi nel specifiche che sono dichiarate con xs: enumeration. Sto cercando di pensare a cosa succede quando esce la prossima versione (4.0). La mia libreria di classi può funzionare in una modalità 3.0 e in una modalità 4.0? Se la prossima versione è compatibile al 100% con versioni precedenti, allora forse. Ma se i valori di enumerazione sono stati rimossi dalle specifiche, allora sono morto nell'acqua.