Perhatikan contoh di bawah ini. Setiap perubahan pada enum ColorChoice mempengaruhi semua subkelas IWindowColor.
Apakah enum cenderung menyebabkan antarmuka yang rapuh? Adakah sesuatu yang lebih baik daripada enum untuk memungkinkan fleksibilitas polimorfik yang lebih banyak?
enum class ColorChoice
{
Blue = 0,
Red = 1
};
class IWindowColor
{
public:
ColorChoice getColor() const=0;
void setColor( const ColorChoice value )=0;
};
Sunting: maaf karena menggunakan warna sebagai contoh saya, bukan itu pertanyaannya. Berikut adalah contoh berbeda yang menghindari herring merah dan memberikan lebih banyak informasi tentang apa yang saya maksud dengan fleksibilitas.
enum class CharacterType
{
orc = 0,
elf = 1
};
class ISomethingThatNeedsToKnowWhatTypeOfCharacter
{
public:
CharacterType getCharacterType() const;
void setCharacterType( const CharacterType value );
};
Lebih jauh, bayangkan bahwa menangani ke subclass ISomethingThatNeedsToKnowWhatTypeOfCharacter yang tepat diberikan oleh pola desain pabrik. Sekarang saya memiliki API yang tidak dapat diperpanjang di masa depan untuk aplikasi yang berbeda di mana tipe karakter yang diijinkan adalah {human, dwarf}.
Sunting: Hanya untuk lebih konkret tentang apa yang saya kerjakan. Saya merancang pengikatan yang kuat dari spesifikasi ( MusicXML ) ini dan saya menggunakan kelas enum untuk mewakili tipe-tipe tersebut dalam spesifikasi yang dideklarasikan dengan xs: enumeration. Saya mencoba memikirkan apa yang terjadi ketika versi berikutnya (4.0) keluar. Bisakah perpustakaan kelas saya berfungsi dalam mode 3.0 dan mode 4.0? Jika versi berikutnya kompatibel 100% ke belakang, maka mungkin. Tetapi jika nilai pencacahan dihapus dari spesifikasi maka saya mati di air.