如果我們可以通過setter和getters訪問私有成員,那麼private有什麼用?公共和私人訪問修飾符
回答
因爲獲取者和設置者可以充當代理。它們使得你可以隱藏類的實際內部,只允許外部類通過方法訪問數據。無論你想要什麼,都可以讓你對待課堂的內部人員。
僅僅因爲你的getter/setter被命名爲getName()
而你的財產被稱爲name
,並不意味着它永遠是那樣的。
如果您想將變量更改爲fullName
,該怎麼辦?如果您直接訪問公共變量,則更改會破壞很多代碼。相反,您可以簡單重新映射getName()
從哪裏獲取數據。
我最好的例子之一是我自己的URL類,我允許創建和操作一個URL。如果你想設置該方案,你可以得到$obj->setScheme()
。但是,您不知道每次更改URL時是否手動生成字符串,無論是將它們存儲爲單獨的部分。這給了我靈活性,因爲我可以存儲您的數據,但我想。
此外,我可以在存儲數據之前對數據進行預處理。在我的URL類中,我假定所有的方案和主機名都是小寫的。我可以通過將通過setHost()
保存的所有字符串轉換爲小寫,然後存儲它們來標準化。如果我使用公共變量,則必須假定將數據放入的客戶端正確存儲它。
它們還可以驗證正在傳入的信息,以確保它是有效的數據,如果不是,則會導致錯誤。
沒有人強迫你爲每個變量放入getter和setter。事實上,即使很多「面向對象的封裝」教程出於某種原因始終這樣做,所以對每個變量盲目使用私有成員+虛擬獲取者& setter是毫無意義的。首先,從併發的角度來看,封裝是沒有封裝。
我想你真正想明白的是爲什麼我們使用公共屬性與私人支持領域,而不是僅僅使用公共領域。像這樣的SO有幾個問題;這裏有一個:
What is the difference between a Field and a Property in C#?
您需要的私人執行封裝。它是面向對象編程的基本範式之一,用於保持獨立於界面的某些東西的實現。這減少了不同程序部件之間的耦合,並且從長遠來看使其更易於維護。
看看下面的例子:
class toto {
private String someThing;
public String getSomething();
public void setSomething(String Something);
}
如果更改上面簡單地把一些公衆,確保你有更少的代碼,但如果有一天,有什麼需要改變,以更復雜的對象一些新功能而舊的代碼仍然可以正常使用字符串,那麼你需要改變一切。通過隔離的東西的內部表示,你可以更容易
class toto {
private ComplexSomeThing someThing;
public String getSomething(){ someThing.toString();}
public void setSomething(String something){ something = new ComplexSomeThing(something);}
public ComplexSomeThing (getComplexSomething();
public void setComplexSomething(ComplexSomething someThing);
}
還有其他原因,使封裝件好事(TM)進化系統,這僅僅是一個愚蠢的例子來說明這一點。
編輯 有一個辯論有點的,現在來使用保護VS私人或使用屬性的概念類似於在一些語言(DELPHI,C#),而不是getter和setter方法(如Java中)。 受保護的而不是私有的將允許代碼的客戶更容易的更改,但它確實暴露了系統的內部,所以在API的可用性和可維護性之間尋求平衡。然而,封裝的基本原則仍然存在。 無論選擇哪個選項,仍然需要展示連貫且在相同抽象級別上的功能,並隱藏關於如何完成的血淋淋的細節。
對我來說,辯論不是要宣佈對私有的聖戰,而是要找到一種方法來提供可擴展性和靈活性,同時不破壞API的連貫性。
Heresomeinteresting閱讀有關私人,如果你想進一步挖掘。不過,我必須強調,在形成對私人的意見之前,你應該真正掌握encapsulation和polymorphism的概念,它們的表面簡潔性隱藏了一些細微的complexities。
我認爲你到目前爲止有很好的答案(信息隱藏和所有這些)。只是想添加一個關於使用setter的建議。
正如你所提到的使用訪問器使私有變量有點沒有意義,並且在某些環境中,使用getters和setter的性能後果使它變得毫無價值。
另一方面,如果你沒有這樣的擔憂,我認爲使用getters並不是那麼糟糕,但是在使用setter之前你應該三思。他們讓你的對象可變這是特別難以維護的併發環境。
- 1. 訪問修飾符:私人與保護
- 2. 非法修飾的組合:公共和私人
- 3. Resharper - 如何關閉'私人'訪問修飾符?
- 4. 公共訪問私人npm模塊從私人github回購
- 5. 公共/私人
- 6. 如何限制引用庫中的公共訪問修飾符?
- 7. 爲什麼是事件的行動代表使用的「公共」訪問修飾符總是表現得「私人」
- 8. 私人和公共變量
- 9. 私人和公共職能
- 10. Ruby私有和公共訪問者
- 11. 訪問表單模塊中的變量的公共和私人修改器
- 12. 公共和私人訪問爲相同的成員函數
- 13. 允許公共和私人訪問文件?
- 14. 公共和私人憑證同時訪問
- 15. WPF控件的公共類修飾符
- 16. 您應該在Ruby中使用私有,受保護和公共修飾符嗎?
- 17. .NET類訪問修飾符(朋友和公衆)
- 18. 通過訪問修飾符
- 19. 保護訪問修飾符
- 20. 包訪問(protected修飾符)
- 21. 類訪問修飾符
- 22. EventInfo訪問修飾符
- 23. 類和訪問修飾符在.NET
- 24. javascript中的類和訪問修飾符
- 25. 縮進「公」和「私」可見性修飾符的
- 26. 推送私人或公共?
- 27. 私人與公共繼承
- 28. 私人/公共qt信號
- 29. 私人與公共港口
- 30. 訪問說明符和訪問修飾符有什麼區別?
哪種語言? – 2010-03-24 05:08:34
@Frank並不重要...... – 2010-03-24 05:10:42