若邏輯上 A 是 B 的「一部分」(a part of),不允許 B 從 A 派生,而應以組合方式構建 B。
class Eye { public: void Look(); };
class Nose { public: void Smell(); };
class Mouth{ public: void Eat(); };
class Ear { public: void Listen(); };
// 正確設計:組合
class Head {
public:
void Look() { eye.Look(); }
void Smell() { nose.Smell(); }
void Eat() { mouth.Eat(); }
void Listen() { ear.Listen(); }
private:
Eye eye; Nose nose; Mouth mouth; Ear ear;
};
// 功能正確、程式碼短,但設計錯誤
class Head : public Eye, public Nose, public Mouth, public Ear { };
公雞追打產鴨蛋的母雞 —— 繼承關係錯誤導致行為荒謬。
「執行正確」的程式不等於高品質程式。
滿足上述任一條件,優先選擇組合。