我试图在子类中以不同的方式访问受保护的成员变量。我发现我不能通过使用子类的对象引用到父类对象来实现。这里我指的是以下程序中的“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 :(得分:1)
有趣的问题 - the msdn states that this won't work:
可以在派生类中访问基类的受保护成员 仅当通过派生类类型进行访问时才会发生。
由于您使用的是basetype而不是派生类型,因此这不起作用。
但为什么呢?我可以想象这与客户也可以由另一个类派生而不是CorporateCustomer的问题有关。在这种情况下,您分配给Customer的实例不一定是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实例成员的受保护访问权限在受其保护的实例成员访问其类的程序文本之外时 声明,并在访问受保护的内部实例成员时 在宣布它的程序的程序文本之外, 访问必须在派生自的类声明中进行 声明它的类。 此外,还需要访问权限 通过派生类类型的实例或a 由它构造的类类型。此限制可防止派生 即使是访问其他派生类的受保护成员的类 当成员继承自同一个基类时。