回答
「被保護的成員是從 其所 聲明的類中訪問,並從從宣佈 該成員的類派生的任何類 之內。」
看到
http://msdn.microsoft.com/en-us/library/bcd5672a(VS.71).aspx
-1:不回答「我們爲什麼使用它」。 – Timwi 2010-09-02 11:54:23
但先生,而不是宣佈受到保護,我們也可以使用作爲私人根據你的答案。 – 2010-09-02 12:11:33
@Nishant - 不是這樣的:'私人'限制成員只能被這個類使用,而對其他任何類都不可見。 – 2010-09-02 14:34:35
這意味着該字段只類本身和繼承類可見。從MSDN
定義在另一個答案中提供。爲什麼這很好?當protected
允許他們訪問基類實現時,不需要將基類中的數據/代碼複製到其派生類,而不會不必要地暴露於public
暗示的不受限制的外部使用。
正如其他人已經指出:
protected關鍵字是一個成員 訪問修飾符。受保護的成員是 其類中可訪問,並且由 派生類實例。
這裏是一個小例子:
public class A
{
protected string SomeString;
public string SomeOtherString;
}
public class B : A
{
public string Wrapped
{
get { return this.SomeString; }
}
}
...
var a = new A();
var s = a.SomeOtherString; // valid
var s2 = a.SomeString; // Error
var b = new B();
var s3 = b.Wrapped; // valid
很好的解釋先生.... – 2010-09-02 12:16:07
感謝您的清晰和良好的解釋先生 – 2010-09-02 12:18:52
不客氣。 – 2010-09-02 12:23:29
每個人的答案是相似的(定義和/或摘錄/鏈接到MSDN),所以生病嘗試回答你原來的3個問題:
含義:
任何標有'protected'的字段意味着它只對本身和任何子類(從它繼承的類)都是可見的。你會注意到在ASP中。NET Web Forms代碼隱藏在模型後面,事件處理程序(如Page_Load)被標記爲「受保護」。這是因爲ASPX標記文件實際上從代碼隱藏文件繼承(查看@Page指令來證明這一點)。
我們爲什麼使用它:
共同使用保護可訪問修飾符的是給孩子訪問它的父母性能。您可能有許多子類派生自的基類。這個基類可能有一個共同的屬性。對於受保護的財產來說,這是一個很好的例子 - 以促進共同邏輯的重用和集中維護。
效益:
一種類似的問題,以 「我們爲什麼使用它?」但基本上它可以對屬性進行粗粒度控制。你不能只想到「當你使用保護」。這更多的是選擇何時使用哪種可訪問性修飾符(私有,公共,內部,受保護)的情況。所以這個好處與任何可訪問性修飾符的好處是一樣的 - 提供一個健壯和一致的對象模型,最大限度地利用代碼並最大限度地減少與錯誤暴露的代碼相關的安全風險。
希望有所幫助。
是否可以在抽象類中訪問受保護的方法,或者我們是否需要重寫它?例如,我有一個名爲「爸爸」的類,它有一個'保護無效WalkingAndRunning()'方法。 「爸爸」班由「兒子」班繼承。有沒有可能在那裏使用'protected void WalkingAndRunning()'方法?只是好奇。 – Musikero31 2011-12-02 07:10:46
想想這樣吧。一類呈現三個接口:
- 邁向本身,全面進入內部實現細節(公有,保護,私有方法和屬性)。根據定義,任何你在課堂上做的事情都可能影響其他任何事情。
- 朝向其客戶端,只能訪問公共方法和屬性。爲了最大限度地減少變化的意外後果,您最大限度地減少了一個類的公共接口:越少的代碼知道你的內部,越可以隨意修改它們。
- 朝其後代,有權訪問公衆和受保護的方法和屬性。無論你做什麼保護和公共方法,不僅會影響客戶,還會影響修改班級基本功能的後代。 OO約減少coupling並增加cohesion:類之間沒有比繼承關係更強的耦合(當然,除了C++
friend
之外)!
第三個接口是OO中最難的通用設計挑戰:可以合理地重寫什麼(虛擬方法和屬性),以及爲了重寫需要什麼其他功能(普通保護方法和屬性)?因爲這是一個很大的挑戰,默認情況下類別爲sealed
實際上是一個好主意,與OO初學者經常相似,這似乎是一個不必要的障礙。
- 1. C++中如何實現私有和受保護的關鍵字
- 2. 保護關鍵字
- 3. 聯合中的「受保護」關鍵字的用途是什麼?
- 4. C#的「受保護內部」是指「受保護」*或*「內部」。任何關鍵字是否意味着「受保護」*和*「內部」?
- 5. C++受保護的訪問
- 6. C#保護關鍵字相關的問題
- 7. sp_executesql保護動態搜索關鍵字
- 8. XML受保護字符
- 9. 關於訪問受保護的方法
- 10. 爲什麼Joomla不使用私人,公共和受保護的關鍵字?
- 11. C#訪問受保護的領域
- 12. C#中的「受保護」方法?
- 13. C++ - 有關「受保護繼承」的問題
- 14. 克隆受保護的邊緣受保護的驅動器
- 15. 受保護的內部和受保護的行爲類似
- 16. 保護OpenLayers免受政府關機
- 17. Java:覆蓋受保護的字符串
- 18. 受保護字段的可見性
- 19. 如何模擬受保護的字段?
- 20. 受保護的內部和內部受保護有區別嗎?
- 21. Spring oauth2指定受保護和不受保護的資源
- 22. 覆蓋受保護的內部受保護!
- 23. 受保護與不受保護的區別
- 24. 在c#中的屬性設置中使用虛擬和受保護的關鍵字?
- 25. C++類(公共,私有和受保護)
- 26. 保護目錄免受修改C#
- 27. Objective-C中的保留關鍵字?
- 28. C++中基類中受保護字段的問題
- 29. 受保護字段的細微C++繼承錯誤
- 30. Junit受保護的方法
只是覺得它*必須*是重複的,但我無法在其他地方找到完全相同的問題。 – serg10 2010-09-02 11:48:21
既然您已經從這些答案中獲得了基本知識,那麼您可能需要深入研究一些微妙之處。請參閱http://blogs.msdn.com/b/ericlippert/archive/tags/protected/中的一些。 – 2010-09-02 14:27:39
相關:http://stackoverflow.com/questions/3500298/what-is-the-difference-between-access-specifier-protected-and-internal-protected – 2010-09-02 17:16:07