封裝概念
回答
一旦你意識到它(可能)來自與膠囊相同的基本詞,封裝是一個相當簡單的概念。
它只是一個信息的遏制。
封裝意味着一個類只發布其他人使用它所需要的內容,而不是更多。這被稱爲信息隱藏,它意味着類可以完全改變其內部,而不會影響他們的任何用戶。
換句話說,字典類可以作爲一個簡單的數組開始生活,並進展到一個二叉樹的詞彙,甚至可能是某些數據庫訪問函數,所有這些都不會改變它的接口。
在一個面向對象的世界裏,對象擁有數據和操縱數據的方法,這是封裝的頂峯。一種方法是確保每個對象知道調用哪些函數來操作其數據,並確保調用正確的函數。
舉個例子,下面是我的神話保持整數列表的一類,但奇怪的是Python的,因此希望通俗易懂,語言:
class intlist:
private int val[10]
private bool used[10]
public constructor:
for i in 0..9:
used[i] = false
public function add (int v):
for i in 0..9:
if not used[i]:
used[i] = true
val[i] = v
return
throw intlist-full
public function del (int v):
for i in 0..9:
if used[i] and val[i] == v:
used[i] = false
return
throw intlist-invalid-value
現在這裏公佈的僅信息是構造和兩個功能用於添加和刪除。
因爲一切都封裝了,所以我可以隨意更改它,而不會破壞使用它的代碼。
我可以使數組更長,我可以將它們存儲在二叉樹中而不是數組中以使其更快。只要發佈的API不會改變,我就可以自由地做我想做的事情。實際上,我也可以在不添加其他代碼的情況下將其添加到API中,但我無法刪除或更改任何依賴的代碼。
您應該注意,封裝不是面向對象的新東西。通過確保信息隱藏在模塊中(通常是源文件或其包含私有頭文件的組),它已經存在很久了。
事實上,stdio.h
FILE*
東西是一個很好的例子。你不需要保護指針後面的內容是什麼,因爲所有使用它的函數都知道如何去做。
我總是它向人們解釋是認爲自己作爲一個對象。其他人可以看到你的身高,他們可以看到你的笑容,但你的內心想法,也許是你笑的原因,只有你知道。
封裝 - 將數據封裝在一個單元中。我們也可以說隱藏了重要細節的信息。 example 你有一部手機......有一些界面可以幫助你與手機進行互動,並且可以使用手機的服務。但實際上在手機上工作是隱藏的。你不知道它在內部是如何工作的。
隱藏/綁定東西:例如:一個膠囊(當我們在病態時使用)在其本身上隱藏/粘結一些粉末形式,意味着膠囊包封了包含它的粉末。
數據和行爲的綁定即對象的安全和受控方式的功能。
或封裝的最好的例子是一類,因爲類隱藏類變量/從外部d類函數..
封裝: 結束語數據成員和方法一起成單個單元(即,類)是稱爲封裝。
例如:我們可以考慮一個膠囊。封裝意味着隱藏對象的內部細節,即對象如何做某事。這裏膠囊是一個單元包含很多東西。但是我們不知道側膠囊裏有什麼。
這是用來保護有關對象與其他對象有關的信息的技術。像變量一樣,我們可以將其設置爲Public和Property。當我們訪問該屬性時,我們驗證並設置它。
我們可以通過一些其他的例子。我們的筆記本我們可以使用筆記本電腦,但是我們不知道內部發生了哪些操作。但我們可以使用它。同樣,如移動,電視等
我們可以得出結論,一組相關的屬性,方法和其他部件被作爲一個單一的單元或object.An封裝的對象處理通常被稱爲抽象數據類型。
還有其他幾種方法的封裝,可以使用,作爲一個例子,我們可以採取一個接口的使用。該接口可用於隱藏已實現類的信息。
//聲明爲私有
private string _LegName;
//屬性設置爲公共
public string LegName
{
get
{
return _LegName;
}
set
{
_LegName=value;
}
public class LegMain
{
public static int Main(string[] args)
{
Leg L= new Leg();
d.LegName="Right Leg";
Console.WriteLine("The Legis :{0}",d.LegName);return 0;
}
}
注:封裝提供了一種方法,以防止意外損壞的數據。
謝謝
封裝不僅僅是定義訪問和mutator方法一類多。它是面向對象編程的一個更廣泛的概念,它包含儘量減少類之間的相互依賴性,它通常通過信息隱藏來實現。
封裝美是在不影響用戶的情況下改變事物的力量。
在面向對象的編程語言如Java,您可以通過使用訪問修飾符(公共的,受保護的,私人的,不加修飾,這意味着包私人)隱藏實現細節封裝。通過這些可訪問性級別,您可以控制封裝級別,限制級別越低,發生更高代價的變化時,該類與其他相關類(即用戶類,子類)的耦合程度越高。
因此,我們的目標是不是隱藏數據本身,而是這個數據是如何操作的實施細則。
這個想法是提供一個公共接口,通過它你可以訪問這些數據。您稍後可以更改數據的內部表示而不影響該類的公共接口。相反,通過暴露數據本身,您會破壞封裝,並因此影響改變操作數據的方式而不影響用戶的能力。您使用數據本身創建依賴關係,而不是使用該類的公共接口。當「變化」終於找到你時,你會創造一個完美的雞尾酒。
有幾個原因可能導致您想封裝對字段的訪問權限。 Joshua Bloch在他的着作Effective Java中,在第14項中:最小化類和成員的可訪問性,提到了幾個令人信服的理由,我在這裏引用:
您可以限制可以存儲在字段中的值(即性別必須是F或M)。 您可以在修改該字段時執行操作(觸發事件,驗證等)。 您可以通過同步方法來提供線程安全性。 您可以切換到新的數據表示形式(即計算字段,不同數據類型) 但是,封裝不僅僅是隱藏字段。在Java中,您可以隱藏整個類,從而隱藏整個API的實現細節。例如,在方法Arrays.asList()中考慮一下。它返回一個List實現,但你不關心哪個實現,只要滿足List接口,對吧?將來可以更改實現,而不會影響方法的用戶。
封裝
現在,在我看來的美,真正理解封裝,首先必須瞭解抽象。
想一想,例如,在汽車概念的抽象層面。一輛汽車在其內部實施中是複雜的。他們有幾個子系統,如傳輸系統,休息系統,燃油系統等。
但是,我們已經簡化了它的抽象,並且我們通過其抽象的公共接口與世界上所有的汽車進行交互。我們知道所有的汽車都有一個方向盤,通過這個方向盤我們可以控制方向,他們有一個踏板,當你按下它時,你加速汽車並控制速度,另一個當你按下它時,你停下來,你有一個齒輪棒,讓你控制,如果你前進或後退。這些特徵構成了汽車抽象的公共接口。在早上,您可以開着一輛轎車,然後在下午開車,在下午開一輛SUV,就好像它是一樣的。
然而,我們中很少有人知道所有這些功能如何在引擎蓋下實現的細節。想想汽車沒有液壓系統的時間。有一天,汽車製造商發明了它,並決定將其從汽車中放入汽車中。儘管如此,這並沒有改變用戶與之交互的方式。用戶至多在方向系統的使用方面經歷了改進。像這樣的改變是可能的,因爲汽車的內部實施是封裝的。更改可以安全地完成,而不會影響其公共界面。
現在,認爲汽車製造商決定將燃料蓋放在汽車下方,而不是放在汽車的一側。你去購買這些新車中的一輛,當你用完汽油時,你去加油站,並且你沒有找到加油蓋。突然間,你意識到車底下,但你不能用氣泵軟管達到它。現在,我們已經打破了公共接口契約,因此整個世界都崩潰了,因爲事情並沒有按照預期的方式運行,所以崩潰了。像這樣的變化將花費數百萬美元。我們需要更換世界上所有的加油泵。當我們打破封裝時,我們必須付出代價。
因此,正如您所看到的,封裝的目標是最大限度地減少相互依賴並促進更改。您通過最大限度地減少實現細節的暴露來最大化封裝。只能通過其公共接口訪問類的狀態。
我真的建議你閱讀由Alan Snyder撰寫的一篇名爲封裝和繼承的面向對象編程語言的論文。此鏈接指向ACM上的原始論文,但我確信您將能夠通過Google找到PDF副本。
- 1. OOP封裝概念
- 2. 關於封裝的概念
- 3. OOP概念抽象和封裝
- 4. 如何將泛型組合的概念封裝成新類型?
- 5. n層體系結構是否破壞OO概念封裝
- 6. 概念
- 7. 概念
- 8. 概念
- 9. MVC實現概念(概念(ABAP SAP)
- 10. sqlite概念到coredata的概念?
- 11. 自動裝箱 - 編程概念
- 12. 裝箱和拆箱的概念
- 13. Java如何堆棧類違反替代規則和封裝的概念
- 14. 如何實現封裝其他WCF服務的WCF服務的概念?
- 15. 多層概念
- 16. Laravel MVC概念
- 17. Xamarin MasterPage概念
- 18. Java ArrayList概念
- 19. Android:ViewHolder概念
- 20. Nodejs Promise概念
- 21. 多態概念
- 22. 界面概念
- 23. C++概念:CRTP
- 24. OAuth2.0的概念
- 25. UML:Multiplicity概念
- 26. 概念:在Python
- 27. Android webgl概念?
- 28. 子域概念
- 29. 線程概念
- 30. Java Array概念
你有什麼問題? – Sarfraz 2011-01-23 08:39:25
你有問題還是隻是一個問題? – 2011-01-23 08:39:31