2012-03-13 86 views
0

封裝是一種技術,通過這種技術,提供的功能(公共)對隱藏數據(私有)進行操作並返回結果。封裝與數據隱藏

,內部數據可能在很多的方式來實現(bcoz其隱藏),而不影響接口。

這是否意味着封裝與數據隱藏一樣?

回答

1

使用私有或受保護作爲封裝提供了保護殼,但並未完全隱藏實現。

如果您改變類的私有實現,你仍然需要重建所有使用它,這就是爲什麼人們用「平普爾」和類似的技術完全隱藏實現細節的類。

在C中,沒有私有的或受保護的,但通常會在前向聲明的結構上創建一個用戶永遠不會看到的實現(例如FILE *)或甚至無效的指針,這些指針經常被鍵入某個句柄類型。

我給 Herb Sutter's blog about using pImpls參考。我通常會說,通過私有/公共使用封裝是一種弱化的抽象形式,數據隱藏是一種更強的抽象形式(如果抽象是隱藏實現細節的好詞)但術語一直是我的弱點。

但是,即使你要使用平普爾或什麼的,你不希望任何類或什麼做什麼你與你的實現細節喜歡。通常有什麼可以做什麼的規則,這就是「封裝」模型真正帶來的。

有些人認爲朋友打破封裝,但實際上可以增強封裝,例如讓工廠對象寫入類的私有成員。工廠的目標就像建造你的房子的建築工人一樣,你可以讓他們把所有東西都放在正確的地方給你。

如果你編寫單元測試(你應該),你可以允許你的單元測試訪問你的類的私有成員,以測試你的實現是否正確。

因此,封裝和數據(實現)隱藏都是好東西,應該以適當的方式使用。他們在分配角色時實現類似的事情,但不完全相同。

2

你google了嗎?

前幾個答案都ok:

檢查:

http://www.cplusplus.com/forum/general/21916/

數據隱藏是封裝的一個極端版本,你不但不希望用戶訪問數據成員,但你甚至不希望他們能夠看到他們是什麼。這通常通過使用void指針或前向聲明的結構指針作爲類數據來完成。

+3

只有鏈接的答案令人不悅。你介意解釋一下論壇話題解釋的內容嗎? – 2012-03-13 14:19:27

+0

或者只是讓它成爲評論。 – 2012-03-13 14:45:00

+0

@Matthieu M.我如何從帖子發表評論。我看到這個話題在此期間得到了回答。我將在未來添加更復雜的答案,不僅鏈接 – 2012-03-13 14:52:19

2

我不會那麼說。封裝更多地是一種面向對象的習慣用法。它與你想要隱藏數據的事實沒有多大關係,而是控制了它的訪問方式。僅僅因爲一些數據是私人的,並不意味着它是隱藏的。

試想一下調試,不能看到私人成員。

對於數據隱藏,其它技術可用於 - 像the Cheshire cat pattern (or Opaque pointer pattern)

大多數的實際數據的知識是實現內部迷失在這種情況下,不是因爲它的private,但因爲它是隱藏的。

+0

「封裝」一詞表示包裹在外殼中。不同的是,外殼是否是玻璃的,所以你可以看到裏面的東西,但不能到達它,或者它是由磚或其他材料製成,所以你看不到裏面是什麼。 當然,你可以說它是在一個有鎖的門上,有些人有鑰匙。 – CashCow 2012-03-13 14:26:24