Betrachten Sie das folgende Beispiel. Jede Änderung an der ColorChoice-Enumeration wirkt sich auf alle IWindowColor-Unterklassen aus.
Neigen Aufzählungen dazu, spröde Schnittstellen zu verursachen? Gibt es etwas Besseres als eine Aufzählung, um mehr polymorphe Flexibilität zu ermöglichen?
enum class ColorChoice
{
Blue = 0,
Red = 1
};
class IWindowColor
{
public:
ColorChoice getColor() const=0;
void setColor( const ColorChoice value )=0;
};
Bearbeiten: Entschuldigung für die Verwendung von Farbe als mein Beispiel, das ist nicht, was die Frage ist. Hier ist ein anderes Beispiel, das den roten Hering vermeidet und mehr Informationen darüber liefert, was ich unter Flexibilität verstehe.
enum class CharacterType
{
orc = 0,
elf = 1
};
class ISomethingThatNeedsToKnowWhatTypeOfCharacter
{
public:
CharacterType getCharacterType() const;
void setCharacterType( const CharacterType value );
};
Stellen Sie sich außerdem vor, dass Handles für die entsprechende Unterklasse ISomethingThatNeedsToKnowWhatTypeOfCharacter durch ein werkseitiges Entwurfsmuster ausgegeben werden. Jetzt habe ich eine API, die in Zukunft nicht für eine andere Anwendung erweitert werden kann, bei der die zulässigen Zeichentypen {Mensch, Zwerg} sind.
Bearbeiten: Nur um konkreter zu sein, woran ich arbeite. Ich entwerfe eine starke Bindung dieser ( MusicXML- ) Spezifikation und verwende Enum-Klassen, um die Typen in der Spezifikation darzustellen, die mit xs: enumeration deklariert sind. Ich versuche darüber nachzudenken, was passiert, wenn die nächste Version (4.0) herauskommt. Könnte meine Klassenbibliothek in einem 3.0-Modus und in einem 4.0-Modus funktionieren? Wenn die nächste Version zu 100% abwärtskompatibel ist, dann vielleicht. Aber wenn Aufzählungswerte aus der Spezifikation entfernt wurden, bin ich tot im Wasser.