首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

高品質 C++/C 程式設計指南 第 10 章 (下):組合優於繼承的經典案例

     編輯:關於C++

10.2 組合:Has-a 關係的正確建模

規則 10-2-1:若 A 在邏輯上是 B 的「一部分」(part of),**嚴禁** 讓 B 繼承 A,必須用組合。

正確設計:Head 組合 Eye、Nose、Mouth、Ear

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 {};

為什麼「跑得通」不代表「好設計」?

笑話一則:公雞瘋狂追打母雞,因為母雞產了鴨蛋。
許多程式設計師禁不起「繼承簡潔」的誘惑,**以「能跑」為唯一標準**,忽略語義正確性。「運行正確」≠「高品質」**,此為典型反面教材。

核心啟示

  • Is-a (繼承):子類別**完全符合**父類別契約,可無縫替換 (Liskov 替換原則)。
  • Has-a (組合):整體**包含**部分,部分生命週期通常隨整體,介面需轉發。
  • **寧可多寫幾行轉發函數,也不可濫用繼承**。代碼量不是品質指標,語義正確性才是。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved