2012-03-16 57 views
0

手柄請告訴我一個接口之間的差異處理繼承VS於二OO Langugage

手柄 - 實現是另一個類(手柄:自曝一類的所有功能,但在實際執行中另一個類的編碼處理。 。包含指向實現類(PIMPL方法)手柄就像是一個包裝類)

界面 - 實現在派生類中

這是唯一的區別?

我們在哪裏使用界面,我們在哪裏使用手柄?

+1

您的標題與您輸入的內容不匹配 – 2012-03-16 17:43:48

+1

您能澄清[什麼樣的句柄](http://stackoverflow.com/questions/1303123/what-is-a-handle-in-c)你在說什麼? – Maxpm 2012-03-16 17:44:00

回答

1

「處理」沒有在相對於C++意味着廣泛認可的。不同的人用它來表示完全不同的東西(例如,在Windows上,「句柄」具有相當明確的含義,因此用C++編程的Windows傾向於像Windows那樣使用它)。

至於在其他類實現,這聽起來更像是一個PIMPL比大多數人通常會調用句柄。如果這就是你所談論的那種事情,那麼它在實現和使用方面與繼承有很大的不同。事實上,在很多方面,它有相反之處:繼承允許將彼此不同的類視爲相同。使用pimpl,你有兩個相同的類(在某些方面),但你仍然完全分開。你可以通過一個接口(通常是一個ABC,用C++)來允許新的派生類通過現有的接口進行操作,所以現有的代碼可以使用你的新代碼,而不需要現有代碼修改這樣做。 pimpl通常主要用作編譯器防火牆 - 如果您有一些頻繁更改的代碼,但您不希望每次更改時都重新編譯依賴於它的所有代碼,則pimpl可能會有所幫助(儘管絕對不是萬能的)。

句柄是通常用來指一個不透明的數據類型 - 一個「神奇的cookie」,讓你訪問某些功能,但你不能/不看或直接操縱的。在某種程度上,你可以把幾乎任何類的引用/指針視爲一個句柄(各種類型),但聽到/看到這樣使用的術語是非常不尋常的。更多的時候它像一個在C FILE * - 當你調用fopen,它給你的FILE *。你想在你打開手柄操作任何時候,你通過同樣的FILE *回到你要使用的功能。你,但是,不應該永遠看「內部」,看看它指向,這讓您使用時,或別的東西也不多(在使用開/ lseek的/ LREAD等Unix的水平,文件描述符幾乎相同的方式)。

也許你會想的東西靠近手柄/身體成語,這是用C比較早++受歡迎。在這個成語中,你確實已經在另一個類中實現了。具體來說,「處理」通常提供引用計數,並且主體需要執行任何需要處理的單個項目的多個(計數)引用。該句柄「處理」引用計數,並將幾乎所有其他內容傳遞給實現類。由於引用計數在很大程度上已經不受歡迎,所以這種用法已不再常見。特別是在多線程環境中,引用計數可以(並且經常確實)有相當可觀的速度處罰,所以它的使用是現在比較特殊(其中一次它差點預期可能管理大量數據的大多數類的)。

3

C++不包括任何接口的概念或處理,所以特別是在這種語言在技術上是正確的說,他們是你讓他們的東西。

這就是說,它聽起來像你的概念有點困惑(事實上,也沒有權威的定義肯定沒有幫助)。

通常,手柄是某種值,該值唯一地描述一個對象,但其中它這樣做是不知道誰握住手柄的方式。相反,有一些第三方知道如何從句柄到實際對象,然後持有者必須在需要訪問實際對象時通過該實體。這正是處理的基本原理(從第三方的角度來看):除非你知道它,否則你不希望別人惹你的東西,所以你把它們藏在不透明的手柄後面。

試圖定義一個接口是比較困難的,因爲有很多不錯的人選,根據上下文:

  • 我們可以說,一個類的接口是一組其公共方法和他們的簽名;這就是你必須使用的工具,如果你給了這個類的一個實例
  • 我們也可以說只有public virtual方法和沒有數據成員的類是的一個接口,意思是它建模了兩個實體(「你只可以調用這個方法,但是當你做我保證這樣的迴應」)

如果你想更具體的答案,你將不得不與自己首先是澄清問題然後和我們其他人一起。