Hãy xem xét ví dụ dưới đây. Mọi thay đổi đối với enum ColorChoice đều ảnh hưởng đến tất cả các lớp con IWindowColor.
Làm enums có xu hướng gây ra giao diện giòn? Có một cái gì đó tốt hơn một enum để cho phép linh hoạt đa hình hơn?
enum class ColorChoice
{
Blue = 0,
Red = 1
};
class IWindowColor
{
public:
ColorChoice getColor() const=0;
void setColor( const ColorChoice value )=0;
};
Chỉnh sửa: xin lỗi vì đã sử dụng màu sắc làm ví dụ của tôi, đó không phải là câu hỏi. Dưới đây là một ví dụ khác để tránh cá trích đỏ và cung cấp thêm thông tin về ý nghĩa của sự linh hoạt.
enum class CharacterType
{
orc = 0,
elf = 1
};
class ISomethingThatNeedsToKnowWhatTypeOfCharacter
{
public:
CharacterType getCharacterType() const;
void setCharacterType( const CharacterType value );
};
Hơn nữa, hãy tưởng tượng rằng các tay cầm cho lớp con IS SomethingThatNeedToKnowWhatTypeOfCharacter thích hợp được đưa ra bởi một mẫu thiết kế nhà máy. Bây giờ tôi có một API không thể mở rộng trong tương lai cho một ứng dụng khác trong đó các loại ký tự được phép là {human, lùn}.
Chỉnh sửa: Chỉ để cụ thể hơn về những gì tôi đang làm. Tôi đang thiết kế một ràng buộc mạnh mẽ của đặc tả ( MusicXML ) này và tôi đang sử dụng các lớp enum để biểu diễn các loại đó trong đặc tả được khai báo với xs: enumutions. Tôi đang cố gắng nghĩ về những gì sẽ xảy ra khi phiên bản tiếp theo (4.0) ra mắt. Thư viện lớp của tôi có thể làm việc ở chế độ 3.0 và ở chế độ 4.0 không? Nếu phiên bản tiếp theo tương thích ngược 100% thì có thể. Nhưng nếu giá trị liệt kê bị xóa khỏi đặc tả thì tôi đã chết trong nước.