2015-02-05 68 views
1

我想以不同的方式訪問子類中的受保護的成員變量。我發現我不能通過使用父類對象的子類的對象引用來實現。這裏我指的是下面程序中的「int Number6」。要訪問子類中的父類的受保護的字段

但是我可以訪問公共的「int Number7」。我想知道背後的原因。

public class Customer 
{ 
    #region Fields 



    protected int Number2; 
    protected int Number3; 
    protected int Number4; 
    protected int Number5; 
    protected int Number6; 

    public int Number7; 

    #endregion 


} 

public class CorporateCustomer : Customer 
{ 
    public void PrintID() 
    { 
     CorporateCustomer CC = new CorporateCustomer(); 
     CC.Number2 = 101; 

     base.Number3 = 103; 

     this.Number4 = 104;    

     Customer C2 = new CorporateCustomer(); 
     C2.Number6 = 106; //-> Not Possible to access protected Number6 by this way       

     C2.Number7 = 105; //-> However, can access public field     

    } 
} 
+0

可能的重複[爲什麼我不能訪問C#保護的成員,除了這樣?](http://stackoverflow.com/questions/567705/why-cant-i-access-c-sharp-protected - 成員-除了樣本) – Marwie 2015-02-05 16:33:22

回答

1

有趣的問題 - the msdn states that this won't work

只有如果發生通過派生類類型的訪問一個基類的被保護的成員是在派生 類訪問。

由於您使用的是basetype而不是派生類型,因此這不起作用。

但是爲什麼?我可以想象,這涉及客戶也可以由CorporateCustomer之外的另一個類派生的問題。在這種情況下,您分配給客戶的實例不一定是CorporateCustomer,因此受保護的屬性正確禁止訪問Number6屬性,因爲它會打破訪問限制。

public class PrivateCustomer : Customer 
    { 
    } 

    public class CorporateCustomer : Customer 
    { 
     public void PrintID() 
     { 

      Customer C = new PrivateCustomer(); 
      C.Number6 = 106; //-> Not Possible to access protected Number6 by this way which is alright, as this is not a Corporate Customer      

      C.Number7 = 105; //-> However, can access public field     

     } 
    } 

C#語言規範規定的正是這種例子作爲理由,這並不工作:

3.5.3實例成員的受保護訪問當一個受保護的實例成員的程序文本之外訪問聲明其 的類,以及在聲明其程序的程序文本之外訪問受保護的內部實例成員 時, 訪問必須在派生自 的類聲明中進行,其中類它被宣佈。 此外,訪問需要 通過派生類類型的實例或從它構造的類類型實現。此限制可防止一個衍生的 類訪問其他派生類的受保護成員,即使在成員從相同基類繼承時也可以訪問 。

相關問題