Рассмотрим пример ниже. Любое изменение в перечислении ColorChoice влияет на все подклассы IWindowColor.
Имеют ли перечисления тенденцию вызывать хрупкие интерфейсы? Есть ли что-то лучше, чем enum для большей полиморфной гибкости?
enum class ColorChoice
{
Blue = 0,
Red = 1
};
class IWindowColor
{
public:
ColorChoice getColor() const=0;
void setColor( const ColorChoice value )=0;
};
Изменить: извините за использование цвета в качестве моего примера, это не то, о чем вопрос. Вот другой пример, который избегает красную сельдь и предоставляет больше информации о том, что я подразумеваю под гибкостью.
enum class CharacterType
{
orc = 0,
elf = 1
};
class ISomethingThatNeedsToKnowWhatTypeOfCharacter
{
public:
CharacterType getCharacterType() const;
void setCharacterType( const CharacterType value );
};
Кроме того, представьте, что дескрипторы для соответствующего подкласса ISomethingThatNeedsToKnowWhatTypeOfCharacter разрабатываются с помощью фабричного шаблона проектирования. Теперь у меня есть API, который не может быть расширен в будущем для другого приложения, где допустимые типы символов: {человек, карлик}.
Изменить: Просто чтобы быть более конкретным о том, над чем я работаю. Я проектирую сильную привязку этой спецификации ( MusicXML ) и использую классы enum для представления тех типов в спецификации, которые объявлены с помощью xs: enumeration. Я пытаюсь думать о том, что произойдет, когда выйдет следующая версия (4.0). Может ли моя библиотека классов работать в режиме 3.0 и в режиме 4.0? Если следующая версия на 100% обратно совместима, то возможно. Но если значения перечисления были удалены из спецификации, то я мертв в воде.