2015-02-05 117 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实例成员的受保护访问当一个受保护的实例成员的程序文本之外访问声明其 的类,以及在声明其程序的程序文本之外访问受保护的内部实例成员 时, 访问必须在派生自 的类声明中进行,其中类它被宣布。 此外,访问需要 通过派生类类型的实例或从它构造的类类型实现。此限制可防止一个衍生的 类访问其他派生类的受保护成员,即使在成员从相同基类继承时也可以访问 。