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

C++ 繼承與組合設計指南:正確使用繼承的鐵律

     編輯:VC 教學

10.1 繼承:強大但危險的雙面刃

物件是類別的實例。若將物件比作房子,類別就是設計圖。OO 設計的核心在類別設計,而非物件設計。設計孤立類別容易,難在正確設計基底類別與派生類別。

繼承可提高程式碼復用性,但因「太好用、太容易用」,必須制定嚴格使用規則防止濫用。

規則 10-1-1:無關類別嚴禁為了功能而繼承

若類別 A、B 毫無關聯,不得讓 B 繼承 A 以「白占便宜」獲取功能。這如同讓健壯青年無故吃人參補身,違背邏輯且破壞設計純粹性。

規則 10-1-2:符合「is-a」關係才可繼承

若邏輯上 B 是 A 的「一種」,允許繼承。例:

  • 男人 是 人的一種 → class Man : public Human
  • 男孩 是 男人的一種 → class Boy : public Man

「is-a」的陷阱:現實世界 vs 程式世界

規則看似簡單,實際應用常有意外:

案例一:鴕鳥不是會飛的鳥

生物學上鴕鳥是鳥,但鴕鳥不會飛。若 Bird 有 Fly(),Ostrich 繼承後 Ostrich::Fly 是什麼?拋出例外?空實作?皆違反 Liskov 替換原則。

案例二:圓形不是橢圓形

數學上圓是特殊橢圓,但橢圓有長短軸,圓繼承後擁有多餘屬性,違反「介面隔離」。

更嚴格的繼承規則

若邏輯上 B 是 A 的「一種」,且 A 的所有功能與屬性對 B 均有意義,才允許 B 繼承 A。

這實際上是 Liskov 替換原則 (LSP) 的前身表述:子類別必須能無縫替換父類別,不破壞程式正確性。

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