oop程式設計與類屬程式設計(generic programming)的一大區別:
1> oop使用顯式的介面和執行時多型
2> 類屬程式設計使用隱式介面和編譯時多型
void doprocessing(widget& w) }
當你看到上面的**時,你能在某個檔案裡找到下面的宣告:
class widget ;
widget支援什麼函式一目了然,此之謂「顯式介面」。許多函式以virtual打頭,需在執行時繫結到某個實現上,此之謂「執行時多型」。
下面修改一下doprocessing函式:
templatevoid doprocessing(t& w) }
可以看出,t肯定支援的有size、normalize、swap、copy ctor函式,同時也有很多不確定的因素:
1> 比如size可在t中定義,也可能繼承自父類。
2> size的返回值也不見得就是int。只要其返回的型別支援operator>即可。
3> operator!=可能存在,不存在的話也可以。只要t可以轉型為支援該操作符的型別即可。
...這些不確定的因素,都是隱含的,此之謂隱式介面。有別於oop中函式簽名極為明確的特質。
因為要呼叫doprocessing函式,就要例項化該模板函式,那麼就要確定t是什麼型別。
這些不確定的因素使得doprocessing函式有了多型的性質,而所有這些不確定因素要在編譯時確定下來。
所以,謂之為「編譯時多型」。有別於虛函式要在執行時確定的特質。
Item 41 隱式介面和編譯時多型
oop程式設計與類屬程式設計 generic programming 的一大區別 1 oop使用顯式的介面和執行時多型 2 類屬程式設計使用隱式介面和編譯時多型 當你看到上面的 時,你能在某個檔案裡找到下面的宣告 widget支援什麼函式一目了然,此之謂 顯式介面 許多函式以virtual打頭,需在...
條款41 了解隱式介面和編譯期多型
1 簡介 物件導向程式設計總是以顯式介面和執行期多型來解決問題。例如 class widget void doprocessing widget w 2 所謂的顯式介面 由於w的型別被宣告為widget,因此w需要widget介面,並且我們可以在原始碼中找到這個介面,看到原始碼的樣子,所以稱為是顯式...
條款41 了解隱式介面以及編譯期多型
相對於繼承體系來說,template實際上也使用介面與多型,而繼承體系往往使用到的是顯式介面以及執行期多型,而template實際上用的是隱式介面以及編譯期多型。隱式介面實際上就是類似下面這樣的東西 1 template 2int mytypes t tmp 3 這裡的size相當於這裡的隱式介面。...