2010-03-03 86 views
21

這是一個extension這個question問了一個小時前。覆蓋受保護的內部受保護!

當重寫derived類中的virtual method時,我們無法修改access modifiers。考慮ControlSystem.Web.UI命名空間

public class Control : IComponent, IDisposable,... 
{ 
    protected internal virtual void CreateChildControls() 
    { } 
    . 
    . 
} 

現在考慮這

public class someClass : System.Web.UI.Control 
    { 
     // This should not compile but it does 
     protected override void CreateChildControls() 
     { } 

     // This should compile but it does not 
     protected internal override void CreateChildControls() 
     { } 
    } 

任何機構可以解釋一下嗎?謝謝

回答

43

在重寫派生類中的虛擬方法時,我們不能修改訪問修飾符。

該陳述是錯誤的。在您描述的情況下,您可以和必須更改訪問修飾符。在其他情況下,您不能更改訪問修飾符。

我是指你的規範,其中規定第10.6.4:

override聲明不能改變 虛擬 方法的可訪問性。但是,如果重寫 基方法是受保護的內部和 它是在一個不同的組件 比含有 重寫方法然後組裝倍率 方法的聲明可訪問必須 被保護聲明。

推理很簡單。

你,阿薩德,有一個銀行帳戶,BankAccount。

你有房子。你把房子租給了你最好的朋友查理。

查理有一個兒子大衛,他住在一間公寓裏。

你有一個兒子Elroy,住在一個公寓。

Elroy有一個兒子,你的孫子弗蘭克,他住在一個蒙古包裏。

Elroy有一個最好的朋友格雷格,他和他住在公寓裏。

您授予您自己的BankAccount訪問權限,住在House內的任何人以及您的任何後代。所以可以訪問銀行賬戶的人是Asad,Charlie,Elroy和Frank。

大衛不能進入,因爲他既不是你,也不是你的後裔,他也不住在衆議院。他是你室友的孩子是無關緊要的;他無法訪問您的BankAccount。

Greg無法訪問您的銀行帳戶。他不是你的後代。他不住在衆議院。他與你的後代生活在一起的事實並不能賦予他與你的後裔相同的權利。

現在我們來看問題的關鍵。 Elroy不允許將您的BankAccount訪問權限擴展至Greg。你擁有BankAccount,你說「我自己,我的後代和我的室友」。您的子女無權將BankAccount的可訪問性擴展到您最初設置的範圍之外。

當Elroy描述他對BankAccount有什麼訪問權時,他只被允許說「我授予我和我的後代訪問權限」,因爲那是您已經允許的。他不能說「我允許自己獲得BankAccount,我的後代和公寓的其他居民」。

只是要清楚:

  • 我和我的後代可以訪問=保護訪問
  • 我和我的室友可以訪問=內部訪問
  • 我和我的後代,我的室友可以訪問=保護內部訪問
  • 對照=阿薩德
  • 的CreateChildControls =的BankAccount
  • 樓= System.Web.dll中
  • 查理=任何類型的在System.Web.dll中
  • 大衛=在組件派生類型查理Apartment.DLL
  • 埃爾羅伊= SomeClass的
  • 公寓=您的含有SomeClass的組件
  • 格雷格=某些其它類在Condo.DLL
  • 弗蘭克=在Yurt.DLL SomeClass的衍生型
  • 蒙古包=一些其他組件
+0

因此,在這種情況下,當父母的同居者試圖訪問他們認爲是父母的銀行賬戶時會發生什麼情況,但實際上是孩子的銀行賬戶? IE:System.Web.DLL中的東西試圖調用Control.CreateChildControls()(通過內部可訪問性),但無法訪問someClass.CreateChildControls()? – Tanzelax 2010-03-04 00:07:15

+1

很好的比喻...除了我不會給我住在我家的每個人的銀行帳戶訪問權:) – 2010-03-04 00:29:22

+5

@Eric,有趣的比喻。一個想法 - 也許從*「誰可以訪問我的銀行賬戶*」變成*「誰可以開車我的車」*可能會使這種類比與人們產生更好的共鳴。 – LBushkin 2010-03-04 18:45:14

5

因爲,雖然術語不同,但將其覆蓋爲protected會使成員的可見性保持不變。如果允許您將其覆蓋爲protected internal,那麼您會突然將該成員暴露給您的程序集中的任何其他類型。

+0

Downvot在乎解釋嗎? – 2013-06-22 02:08:29

2

受保護的內部手段受保護或內部。因此,如果通過覆蓋原始程序集的外部,允許將其標記爲受保護的內部,則允許與覆蓋程序相同的程序集中的其他類調用此方法。這實際上意味着原始父母的內部封裝將被違反。