規則 10-2-1:若 A 在邏輯上是 B 的「一部分」(part of),**嚴禁** 讓 B 繼承 A,必須用組合。
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() { m_eye.Look(); }
void Smell() { m_nose.Smell(); }
void Eat() { m_mouth.Eat(); }
void Listen() { m_ear.Listen(); }
private:
Eye m_eye;
Nose m_nose;
Mouth m_mouth;
Ear m_ear;
};
雖代碼較長,但語義精確:Head 擁有 五官,非五官之「一種」。
// 功能正確、代碼極短,但設計錯誤!
class Head : public Eye, public Nose, public Mouth, public Ear {};
笑話一則:公雞瘋狂追打母雞,因為母雞產了鴨蛋。
許多程式設計師禁不起「繼承簡潔」的誘惑,**以「能跑」為唯一標準**,忽略語義正確性。「運行正確」≠「高品質」**,此為典型反面教材。