Rozważ poniższy przykład. Każda zmiana wyliczenia ColorChoice wpływa na wszystkie podklasy IWindowColor.
Czy wytryski powodują kruche interfejsy? Czy istnieje coś lepszego niż wyliczenie, które pozwala na większą elastyczność polimorficzną?
enum class ColorChoice
{
Blue = 0,
Red = 1
};
class IWindowColor
{
public:
ColorChoice getColor() const=0;
void setColor( const ColorChoice value )=0;
};
Edycja: przepraszam za użycie koloru jako mojego przykładu, nie o to chodzi w tym pytaniu. Oto inny przykład, który pozwala uniknąć czerwonego śledzia i zawiera więcej informacji na temat tego, co rozumiem przez elastyczność.
enum class CharacterType
{
orc = 0,
elf = 1
};
class ISomethingThatNeedsToKnowWhatTypeOfCharacter
{
public:
CharacterType getCharacterType() const;
void setCharacterType( const CharacterType value );
};
Ponadto, wyobraź sobie, że uchwyty do odpowiedniej podklasy ISomethingThatNeedsToKnowWhatTypeOfCharacter są wydawane na podstawie fabrycznego wzorca projektowego. Teraz mam interfejs API, którego nie można rozszerzyć w przyszłości dla innej aplikacji, w której dopuszczalnymi typami znaków są {człowiek, karzeł}.
Edycja: Aby być bardziej konkretnym na temat tego, nad czym pracuję. Projektuję silne wiązanie tej specyfikacji ( MusicXML ) i używam klas enum do reprezentowania tych typów w specyfikacji, które są zadeklarowane za pomocą xs: enumeration. Próbuję myśleć o tym, co się stanie, gdy pojawi się kolejna wersja (4.0). Czy moja biblioteka klas może pracować w trybie 3.0 i 4.0? Jeśli następna wersja jest w 100% kompatybilna wstecz, to może. Ale jeśli wartości wyliczenia zostały usunięte ze specyfikacji, to jestem martwy w wodzie.