Considere el siguiente ejemplo. Cualquier cambio en la enumeración ColorChoice afecta a todas las subclases IWindowColor.
¿Las enumeraciones tienden a causar interfaces frágiles? ¿Hay algo mejor que una enumeración para permitir una mayor flexibilidad polimórfica?
enum class ColorChoice
{
Blue = 0,
Red = 1
};
class IWindowColor
{
public:
ColorChoice getColor() const=0;
void setColor( const ColorChoice value )=0;
};
Editar: perdón por usar el color como mi ejemplo, de eso no se trata la pregunta. Aquí hay un ejemplo diferente que evita el arenque rojo y proporciona más información sobre lo que quiero decir con flexibilidad.
enum class CharacterType
{
orc = 0,
elf = 1
};
class ISomethingThatNeedsToKnowWhatTypeOfCharacter
{
public:
CharacterType getCharacterType() const;
void setCharacterType( const CharacterType value );
};
Además, imagine que los manejadores de la subclase ISomethingThatNeedsToKnowWhatTypeOfCharacter apropiada se entregan mediante un patrón de diseño de fábrica. Ahora tengo una API que no se puede ampliar en el futuro para una aplicación diferente donde los tipos de caracteres permitidos son {humanos, enanos}.
Editar: Solo para ser más concreto sobre lo que estoy trabajando. Estoy diseñando un enlace fuerte de esta especificación ( MusicXML ) y estoy usando clases enum para representar esos tipos en la especificación que se declaran con xs: enumeration. Estoy tratando de pensar en lo que sucede cuando salga la próxima versión (4.0). ¿Podría mi biblioteca de clases funcionar en modo 3.0 y en modo 4.0? Si la próxima versión es 100% compatible con versiones anteriores, entonces tal vez. Pero si los valores de enumeración se eliminaron de la especificación, entonces estoy muerto en el agua.