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

高品質 C++/C 程式設計指南:組合優於繼承——「是一部分」關係的正確建模

     編輯:VC 教學

核心原則:規則 10-2-1

若邏輯上 A 是 B 的「一部分」(a part of),不允許 B 從 A 派生,而應以組合方式構建 B。

正確範例: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()   { eye.Look(); }
    void Smell()  { nose.Smell(); }
    void Eat()    { mouth.Eat(); }
    void Listen() { ear.Listen(); }
private:
    Eye eye; Nose nose; Mouth mouth; Ear ear;
};

錯誤範例:Head 多重繼承 Eye、Nose、Mouth、Ear


// 功能正確、程式碼短,但設計錯誤
class Head : public Eye, public Nose, public Mouth, public Ear { };

為什麼這是錯誤?

  • 語意不符:Head 不是 Eye,Head 有 Eye。繼承表達「是一種」(is-a),組合表達「有一個」(has-a)。
  • 耦合過度:繼承暴露基類所有介面,Head 會繼承 Eye 的所有 public/protected 成員,破壞封裝。
  • 多重繼承風險:命名衝突、菱形繼承、型別轉換複雜度爆增。
  • 維護困難:修改 Eye 介面直接影響 Head 及所有衍生類。

經典比喻

公雞追打產鴨蛋的母雞 —— 繼承關係錯誤導致行為荒謬。
「執行正確」的程式不等於高品質程式。

判斷清單:何時用組合?

  • [ ] 關係為「部分-整體」(part-whole)。
  • [ ] 整體生命週期管理部分生命週期。
  • [ ] 整體不需暴露部分完整介面,只需轉發部分操作。
  • [ ] 部分可被不同整體重複使用。

滿足上述任一條件,優先選擇組合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved