注意:
使用繼承語法的衍生類別物件在語法上當然可以百分之百地取代其基礎類別的物件, 但是要在 "語意" 上能夠取代才算是遵循物件導向的設計, 不但直覺上要能取代, 還要滿足下列的測試:物件導向程式設計希望藉由 "繼承" 來重用基礎類別之所有程式碼, 同時更重要的是重用所有使用原來基礎類別物件的客戶模組程式碼, 也就是界面的重用。
- Base class does not provide more services than derived class does. (Derived class can add whatever new services without any constraint.)
- Specifications of derived class "services" a. require no more (input parameters) b. promise no less (output parameters and return value) than specifications of corresponding services in the base class. i.e. WEAKER REQUIREMENT, STRONGER PROMISE
注意:
- 此處所謂的 "重用" 是指完全不需要更改任何一點程式碼
- 我們可以將類別的定義、製作、及服務視為伺服模組 (server), 而將所有使用此類別之程士模組視為客戶模組 (client)
- 程式碼的重用可以分為兩大類:subroutine 及 factoring
範例:
症狀:
範例:Capability Query
後果:
例如:
另外,隨著應用的不同,下面的範例通常不能用繼承的語法來實作:
Contravariance:
例如:下面的 Base::f() 函式
注意:
可是物件導向中的 "繼承" 不是 "特殊化 (specialization)"
原因有二:
"better than" | Jetplane is a special plane. |
"more skilled" | Doctor is a specialized person. |
"subset of" |
Circle is a special ellipse. Ostrich is a special bird. |
"more specific" | Unix is a special operating system. |
"restricted" | A bag that can only contain tennis ball is a specialized bag that can contain any kinds of balls. |
主要原因是集合通常處理的是量化的特徵, 並非物件所有的特徵, 在繼承的觀念中, "是一種 (is-a)" 不是考慮量化的的部份特徵, 而是物件功能全面性地 "取代 (substitution)"。
回
C++ 程式設計課程
首頁
製作日期: 02/19/2001 by 丁培毅 (Pei-yih Ting) E-mail: pyting@cs.ntou.edu.tw TEL: 02 24622192x6615 海洋大學 理工學院 資訊科學系 Lagoon |