??? 接口,通俗的來說就是定義了一組要實現的功能,這些功能被表現為一組函數,
這些函數在語義上給定接口實現類的責任。
??? C++中常用的定義接口的方法是純虛類。但是定義的函數卻是要確定操作類型的
但是從接口在語義上的考慮,其實是不需要的。
??? 用模板技術來改變。
??? 定義一個接口類,在類中只定義接口函數,這些函數是Client要使用的,這個
類是一個模板類,如下
??? template< typename T >
??? class Interface
??? {
??? public:
??????? template< typename T1 >
??????? void Fun( const T &t );
???
??????? ......
??? };
??? 這種方式解決了接口函數被類型限制。
??? 模板類的參數是一個繼承類,這個繼承類完成實際的操作。實體類的定義如下
??? class C : public Interface< C >
??? {
??????? ......
??? };
??? 子類去一個個的實例話其實很不好,也不符合一般C++的編程方法。由于在模板
編程的情況下,更注重的是語義的符合,所以可以在子類中使用重載的方法去實現對
不同類型的實際處理(畢竟沒有類的編寫者知道自己這個類要處理的類型)。那么可
以載接口類中寫些代碼,來調用子類的函數,這種調用實際上在語義上定義了子類要
實現的責任。上面的接口的定義變成下面這個樣子
??? template< typename T >
??? class Interface
??? {
??? public:
??????? T* This( void ) { return static_cast< T* >( this ); }
??????? template< typename T1 >
??????? void Fun( const T &t )
??????? {
??????????? this->This()->Ope( t );
??????? }
???
??????? ......
??? };
???
??? 這樣,子類只用實現對不同類型的處理的Ope函數了,對外的公共接口還是一樣的。
顯現中要講基類編程子類的友員,Ope定義在protected或private作用域中。??
posted on 2007-01-13 18:06
walkspeed 閱讀(2287)
評論(0) 編輯 收藏 引用