以前一直没太用过Protected,今天在做例题的时候遇到继承的问题,我就想了一下给Protected赋值的过程,思想上有些乱,就想看看MSDN上关于这个关键子的陈述,看到下面的例题的时候我都不敢相信自己的眼睛了,原来Protected还有这样的特性:下面是MSDN的说明:
当在声明了某个 protected 实例成员的类的程序文本之外访问该实例成员时,以及当在包含有某个 protected internal 实例成员声明的程序的程序文本之外访问该实例成员时,要求这种访问发生在该成员所属类的一个派生类的程序文本中,并引用该派生类的一个实例。假定 B 是一个基类,它声明了一个受保护的实例成员 M,而 D 是从 B 派生的类。在 D 的类体中,对 M 的访问可采取下列形式之一:
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
M 形式的非限定类型名或初等表达式。
E.M 形式的初等表达式(其中,E 是类 D 或是从 D 派生的类)。
base.M 形式的初等表达式。
除了上述形式外,派生类还可以在它自已的构造函数-初始化器中(第 10.10.1 节)访问它的基类的受保护的实例构造函数。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
在下面的示例中,
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
public class A
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
protected int x;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
static void F(A a, B b)
{
a.x = 1; // Ok
b.x = 1; // Ok
}
}
public class B: A
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
static void F(A a, B b)
{
a.x = 1; // Error, must access through instance of B
b.x = 1; // Ok
}
}
在 A 中可以通过 A 和 B 的实例访问 x,这是因为在两种情况下访问都通过 A 的实例或从 A 派生的类发生。但是在 B 中,由于 A 不从 B 派生,所以不可能通过 A 的实例访问 x。
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
以前一直以为Protected限制的成员只能在继承的类里内部调用,没想到在定义这个类的内部时,对外部的该实例也可以调用其Protected的成员.看来面向对象我理解的还是不好,对对象的构造过程还不太理解,看来要找本专门的书来补充一下这方面的知识了.
一点说明:为什么在标题中要嵌入英文?原因是为了能够让国外的网友能查询到这篇文章。平常在Google上查资料的时候,经常参考国外网友的博客,帮助我解决了很多问题,所以我也想让他们能够参考我写的内容。当然文中我不可能全部译为英文,所以我尽量把代码粘全,靠代码说话吧。