黑马程序员技术交流社区

标题: protected访问修饰符的作用究竟是什么? [打印本页]

作者: 鬼鬼    时间: 2014-3-27 22:39
标题: protected访问修饰符的作用究竟是什么?
本帖最后由 鬼鬼 于 2014-3-28 18:00 编辑

以前老觉得protected的访问限制是本类和本类的派生类,但是今天查了一下MSDN,发现上面的原话是:“访问仅限于包含类或从包含类派生的类型。”没有提到这个类自身的派生类呀,请问C#中子类可以访问父类中protected修饰的成员么?MSDN上面的说明又如何解释?
作者: siyuefeiyang    时间: 2014-3-27 23:34
1.  C#中子类可以访问父类中protected修饰的成员。

2. 对于“访问仅限于包含类或从包含类派生的类型”看一下下面例子应该会对有所帮助

代码如下:
class BaseTest
{
    public int a = 10;
    protected int b = 2;
  }
class ChildTest:BaseTest
{
     int c;
     int d;
     public void printTest()
      {
         BaseTest basetest = new BaseTest();
         this.a=basetest.a;
         this.c = basetest.b;  //会报错
      }
   }

这段代码中派生类中的方法的最后一行代码会报错
下面就来说明一下“访问仅限于包含类或从包含类派生的类型”,包含类能够使用protected类型的应该是没有任何问题了,这里就不说了,主要问题就是集中在为什么在上面的那个例子中基类的实例为什么不能够访问
protected类型的变量,这里就涉及到对protected类型的理解,protected类型并不是能够被派生类所访问就是随心所欲的访问,而是有条件的,访问必须是通过派生类类型发生时,在派生类中的基类的protected类型成员才能够被访问,这里就很清楚了上面的代码并不是通过派生类的类型访问的,而是通过基类的类型访问的,此时此刻,protected和private十分的相似,只不过,protected类型成员能够被派生类所继承并且能够通过派生类类型访问罢了。

改成如下形式就正确了
class BaseTest
{
   public int a = 10;
   protected int b = 2;
  }
class ChildTest : BaseTest
  {
    int c;
    int d;
    static void Main(string[] args)
     {
       ChildTest childTest = new ChildTest();
       Console.WriteLine(childTest.b);
      }
   }


作者: 墨蹄    时间: 2014-3-28 00:28
protected 关键字是一个成员访问修饰符。 受保护成员在其所在的类中可由派生类实例访问。主要是为了保护成员
作者: 鬼鬼    时间: 2014-3-28 18:00
学习了,谢谢!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2