object-oriented programming(面向?qū)ο缶幊蹋┑氖澜缡菄@著 explicit interfaces(顯式接口)和 runtime polymorphism(執(zhí)行期多態(tài))為中心的。例如,給出下面這個(gè)(沒有什么意義的)的 class(類)。
class Widget {
public:
Widget();
virtual ~Widget();
virtual std::size_t size() const;
virtual void normalize();
void swap(Widget& other); // see Item 25
...
};
以及這個(gè)(同樣沒有什么意義)的 function(函數(shù)),
void doProcessing(Widget& w)
{
if (w.size() > 10 && w != someNastyWidget) {
Widget temp(w);
temp.normalize();
temp.swap(w);
}
}
我們可以這樣談?wù)?doProcessing 中的 w:
·因?yàn)?w 被聲明為 Widget 類型的引用,w 必須支持 Widget interface(接口)。我們可以在源代碼中找到這個(gè) interface(接口)(例如,Widget 的 .h 文件)以看清楚它是什么樣子的,所以我們稱其為一個(gè) explicit interface(顯式接口)——它在源代碼中顯式可見。
·因?yàn)?Widget 的一些 member functions(成員函數(shù))是虛擬的,w 對(duì)這些函數(shù)的調(diào)用就表現(xiàn)為 runtime polymorphism(執(zhí)行期多態(tài)):被調(diào)用的特定函數(shù)在執(zhí)行期基于 w 的 dynamic type(動(dòng)態(tài)類型)來確定(參見《C++箴言:絕不重定義繼承的非虛擬函數(shù)》)。
templates(模板)和 generic programming(泛型編程)的世界是根本不同的。在那個(gè)世界,explicit interfaces(顯式接口)和 runtime polymorphism(執(zhí)行期多態(tài))繼續(xù)存在,但是它們不那么重要了。作為替代,把 implicit interfaces(隱式接口)和 compile-time polymorphism(編譯期多態(tài))推到了前面。為了了解這是怎樣一種情況,看一下當(dāng)我們把 doProcessing 從一個(gè) function(函數(shù))轉(zhuǎn)為一個(gè) function template(函數(shù)模板)時(shí)會(huì)發(fā)生什么:
template
void doProcessing(T& w)
{
if (w.size() > 10 && w != someNastyWidget) {
T temp(w);
temp.normalize();
temp.swap(w);
}
}
class Widget {
public:
Widget();
virtual ~Widget();
virtual std::size_t size() const;
virtual void normalize();
void swap(Widget& other); // see Item 25
...
};
以及這個(gè)(同樣沒有什么意義)的 function(函數(shù)),
void doProcessing(Widget& w)
{
if (w.size() > 10 && w != someNastyWidget) {
Widget temp(w);
temp.normalize();
temp.swap(w);
}
}
我們可以這樣談?wù)?doProcessing 中的 w:
·因?yàn)?w 被聲明為 Widget 類型的引用,w 必須支持 Widget interface(接口)。我們可以在源代碼中找到這個(gè) interface(接口)(例如,Widget 的 .h 文件)以看清楚它是什么樣子的,所以我們稱其為一個(gè) explicit interface(顯式接口)——它在源代碼中顯式可見。
·因?yàn)?Widget 的一些 member functions(成員函數(shù))是虛擬的,w 對(duì)這些函數(shù)的調(diào)用就表現(xiàn)為 runtime polymorphism(執(zhí)行期多態(tài)):被調(diào)用的特定函數(shù)在執(zhí)行期基于 w 的 dynamic type(動(dòng)態(tài)類型)來確定(參見《C++箴言:絕不重定義繼承的非虛擬函數(shù)》)。
templates(模板)和 generic programming(泛型編程)的世界是根本不同的。在那個(gè)世界,explicit interfaces(顯式接口)和 runtime polymorphism(執(zhí)行期多態(tài))繼續(xù)存在,但是它們不那么重要了。作為替代,把 implicit interfaces(隱式接口)和 compile-time polymorphism(編譯期多態(tài))推到了前面。為了了解這是怎樣一種情況,看一下當(dāng)我們把 doProcessing 從一個(gè) function(函數(shù))轉(zhuǎn)為一個(gè) function template(函數(shù)模板)時(shí)會(huì)發(fā)生什么:
template
void doProcessing(T& w)
{
if (w.size() > 10 && w != someNastyWidget) {
T temp(w);
temp.normalize();
temp.swap(w);
}
}