物件是類別的實例。類別 = 設計圖,物件 = 房子。**設計孤立類別易,設計正確繼承體系難**。本章聚焦「繼承」與「組合」概念。
註:當前熱點 COM/CORBA 超出本書範疇,請參閱專書。
class A { public: void Func1(); void Func2(); };
class B : public A { public: void Func3(); void Func4(); };
B b;
b.Func1(); // 繼承自 A
b.Func2(); // 繼承自 A
b.Func3(); // 自有
b.Func4(); // 自有
繼承提升複用性,但**因太好用、太容易,必須立規矩防濫用**。
別為了「白撿功能」讓健壯青年無故吃人參。類別間無邏輯關聯時,**組合或獨立設計**才是正道。
class Human { ... };
class Man : public Human { ... }; // 男人是人
class Boy : public Man { ... }; // 男孩是男人
| 現實分類 | 程式建模衝突 |
|---|---|
| 鴕鳥 是 鳥 | 鳥有 Fly(),鴕鳥飛不了 → Ostrich::Fly 怎麼辦? |
| 圓 是 橢圓 | 橢圓有長/短軸,圓繼承後長短軸多餘 → 畫蛇添足 |
若 B 是 A 的一種,且 A 的所有功能屬性對 B 均有意義,方允許繼承。
違反者須用組合、介面隔離或策略模式重構。