protected用法是:访问仅限于包含类或从包含类派生的类型;private用法是:访问权限仅限于此类中;下面是我写了一个简单代码,令我不解的是:如果在父类中声明一个属性用protected修饰,我在子类中如果想调用父类中被protected修饰的属性时,必须先将父类中的被protected修饰的属性进行封装才可以。如果不对父类中被protected修饰的属性进行封装的话:
程序就会报错:“错误 无法通过类型“ConsoleApplication3.BaseTest”的限定符访问保护成员“ConsoleApplication3.BaseTest.b”;限定符必须是类型“ConsoleApplication3.ChildTest”(或者从该类型派生)的“

这是为什么啊?怎么protected的用法和private的用法都一样啊??搞不懂啊!!(以下是代码)using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplication3
{
    /// <summary>
    /// 父类
    /// </summary>
    class BaseTest
    {
        public int a = 10; 
        //如果不对protected b进行封装的话,会报错
        protectedint b = 2;    }
}using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplication3
{
    /// <summary>
    /// 子类
    /// </summary>
    class ChildTest:BaseTest
    {
        int c;
        int d;
        public void printTest()
        {
            BaseTest basetest = new BaseTest();
            this.a = basetest.a;
           //当程序走到这一步时就不报错!不知道怎么回事(感觉怎么和private用法差不多啊,别的类调用时进行封装才可以)
            this.c = basetest.b;
        }
    }
}

解决方案 »

  1.   

    好象在你的子类的构造函数这里,应该加上父类的构造引用,
      public void printTest() : base()
      {
      BaseTest basetest = new BaseTest();
      this.a = basetest.a;
      //当程序走到这一步时就不报错!不知道怎么回事(感觉怎么和private用法差不多啊,别的类调用时进行封装才可以)
      this.c = basetest.b;
      }
      

  2.   

    问你一下用protected修饰过的属性需要进行封装吗?
      

  3.   

    BaseTest basetest = new BaseTest();
    换成
    ChildTest basetest = new ChildTest();
    就不报错,子类中实例化父类编译器认为是在类外部访问
      

  4.   


    我有个问题想问问你啊?如果我声明了一个protected修饰的属性然后在对它进行封装是什么意思啊?
    就好比这样啊:
      private int a;        protected int A
            {
                get { return a; }
                set { a = value; }
            }
      

  5.   

    字段 a 直接访问被认为不安全,所以采用 A 属性来间接的访问 a ,这种加中间层的方式,就是封装
      

  6.   

    开玩笑。你老酒喝多了?这个和什么private以及prodected都没有关系。原因是你根本就没搞清楚限定符是做什么的。比如说private,它的作用是使得成员变量私有。成员变量是什么???怎么可能是另一个对象的成员变量呢?比如说:
    class A
    {
        private int a = 0;
        public void foo(A other_a)
        {
            a = 1; // a是成员变量
             other_a.a = 2; // error, 这个a分明是另一个对象的,关成员变量什么事情?!
        }
    }这好比说钱包对于一个人来说是私有的。那当然是指张三的钱包对于张三来说是私有的,李四的钱包对于李四是私有的。你怎么会觉得只要是人,都可以看见钱包都能拿,张三能拿李四的钱包么?所以表面上看你是不懂语法,实际上你根本就不知道面向对象是什么,你要用程序做什么。
      

  7.   

    不是我不懂为什么 我书上写了一个 用protected修饰的字段 然后 有把这个字段封装成属性;
    如:  protected string Name{get;set;}
    我知道这是用了一个自动属性,但是我不懂,父类中的属性既然是protected修饰的 ,为什么还要对他进行 封装字段是他变为属性哪? 我试了一下,如果写成:“protected string Name{get;set;}”这样是不是失去了protected的作用啊?
      

  8.   

    属性 get 和 set 某一个字段,才能称为对该字段的封装,protected string Name{ get; set; } 这种是独立属性