OO思想 關於C 的介面類

2021-05-22 02:47:22 字數 1927 閱讀 2415

文章出處:http://hi.baidu.com/%cf%f4%ca%ae%c8%fd%c0%c9/blog/item/651b47dad560f8d1b7fd48f1.html

多型是oo的一大特點,通常我們把只有純虛函式的抽象類,叫做介面類(inte***ce class),或者是協議(protocol class)。

習慣上類名會用大寫i開頭,但這不是必須的,比如下面乙個類宣告。

class ipool

public:

virtual  ~pool() = 0{}

virtual void* allocate(size_t  size) = 0;

virtual void* deallocate(void* p) = 0;

virtual void* destroy(void) = 0;

下面簡單說說使用抽象類的好處。

1. 隱藏實現細節

因為真正的實現是由抽象類的繼承類來實現的,所以這個介面的使用者並不需要關心它內部具體是如何實現的,只需要了解它的功能特性,是用來幹什麼的。比如,現在ipool有兩個繼承版本,largepool和smallpool,使用者在使用的時候,可能是這樣:

//我現在想使用大容量的池

ipool*  pool = poolfactory->create( pt_ large);

//我現在又想使用小一點的池

ipool*  pool = poolfactory->create( pt_small );

//甚至,沒有多餘的列舉和巨集,而是這樣:

//我現在想使用大容量的池

ipool*  pool = poolfactory->create( _t("large") );

...//我現在又想使用小一點的池

ipool*  pool = poolfactory->create( _t("small") );

這樣,使用者只需要了解large和small對應的兩個池的功能和特點,並不關心它們是如何實現的。甚至根本不知道largepool和smallpool這兩個類的**宣告,largepool和smallpool內部可能還有很多可用的成員資料和方法,但是只暴露出一部分子集供別人呼叫。

2.  減少耦合性

不同的模組可能有不同的介面,乙個稍複雜的內部實現,可能是兩個介面的功能合併。這個時候,對乙個介面做了大的調整,不會影響到另乙個介面。呵呵,這樣說有點繞,舉個例子吧,乙個模組modulea,提供了乙個介面ib供模組moduleb使用,也提供了乙個介面ic供模組modulec使用。

在modulea的內部,ib和ic可能需要用同乙個類implbc實現,這個類只是把不同的子集提供給不同的模組使用。

這個時候如果對ib做了一些調整,那麼,ic原來的介面不變,c模組不需要對呼叫**做調整。

注意:另一種情況是,implbc這個類沒有提供介面,而是把赤裸裸的類宣告暴露給moudleb和moudlec,這個時候,如果需要調整對moudleb的呼叫關係,只能是修改implbc的類宣告。雖然對於modulec可能不需要修改源**,但是modulec還是需要根據implbc標頭檔案的變更,來重新編譯乙個新版本。仔細體會一下兩者之間的區別。

你可能覺得重新編譯一下沒有什麼啊,如果你做過dll給別人使用你就知道了,假如你發布了乙個sdk供別人使用,你不能因為sdk中的dll內部做的調整,也要求使用dll的人也得根據你更新的標頭檔案來重新編譯一次把。這種情況下,盡量不要調整介面,使用com是最佳選擇。試想一下,如果dx sdk每次更新,都要求你重新編譯你的源**,那是什麼情況。

3.  更實際的好處  編譯時間快了

由於以上兩個原因,這一點就很好理解了。相信一定有人遇到這樣情況:有時可能只是對乙個類的private成員資料做了一些調整,但是結果是有大批大批的檔案需要重新編譯。。。所以,根據情況,看看是不是需要,能不能使用介面類。

關於OO設計的原則

關於oo設計原則,網上眾說紛紜,有6大設計原則,也有5大設計原則的說法。暫時先把這些概念記錄下來,以便後來理解。1.srp single responsibility principle 單一職責原則 我的理解為設計出來的乙個模組對應其所預期的職責。進一步簡化,就是設計出來的乙個類,僅僅負責乙個功能...

關於物件導向思想,抽象類和介面,多型等的解釋

一 如何解釋物件導向的思想 答 物件導向程式設計的基本思想是,用類來描述實體的抽象型別,將現實中的事務抽象為物件,把物件賦予相應的狀態和行為,通過對訊息的響應完成一定的任務。而物件都具有下面兩個共性 1.具有一定的的狀態和特性2.每個物件都有特定的操作。如下邊簡單 public class peop...

C 類的鏈式程式設計思想

include include using namespace std class person void add10 每呼叫一次age加10 person string name,int age int main 我們這樣重複的呼叫add10 函式來多次改變person物件中age成員變數的值,有...