一直没搞清楚protected访问修饰符的意思,不是说能在派生类中被访问到的吗,这里所说的能被派生类访问到到低是个什么意思啊,搞不懂了。public class father
{
  protected string name="name1";
}
public class son:father
{
  public void method()
   {
      father obj=new father();
      string name2=obj.name;//这里为什么obj访问不到name
      name2=base.name;//这个可以访问到
   }
}

解决方案 »

  1.   


    你这个要好好看看书。public class father 

      protected string name="name1"; 

    public class son:father 

      public void method() 
      { 
          father obj=new father(); 
          string name2=obj.name;//这里就相当于外部访问,跟继承没有关系
          name2=base.name;//这里就是访问父类,直接使用name2=name也可以访问。
      } 
    }
      

  2.   

    public void method()
      {
          father obj=new father();
          string name2=obj.name;//这里为什么obj访问不到name
          name2=base.name;//这个可以访问到
      } 
    你要看this 和你调用的对象之间的关系   而不是看你把代码放在哪个位置
    this和base的关系 是派生类
    this和obj是没关系的2个实例
      

  3.   


    那我这样public void method()
      {
          father obj=new father();
          string name2=obj.name;//这里为什么obj访问不到name
          name2=base.name;//这个可以访问到
           son obj2=new son();
          name2=obj2.name;
      }
    这里的obj2跟this又有什么关系呢,不是也没关系吗??
      

  4.   

    使用base.Name你创建实例当然访问不到
      

  5.   

    是没关系 所以你也访问不到obj2.name
      

  6.   

    你new 一个实例 father obj=new father(); 
    然后用实例去访问那就是外部访问,不是你写在它子类里,就不是外部访问了。
    protected 说派生类可以访问,也就是派生类中可见。实例是不可以见的
      

  7.   


    大哥!关键这个obj2可以访问到啊,不信你试试???
      

  8.   

    1:兰州不可焦躁。
    2:
    public class father
    {
      protected string name="name1";
    }
    public class son:father
    {
      public void method()
      {
          father obj=new father();//你这里创建了一个父类的实例,而父类中name成员是保护类型的,所以
          string name2=obj.name;//在这里你永远不可能访问到name
          name2=base.name;//这个可以访问到是因为你直接访问其父类的保护成员,这在C#语法中是正确的。
      }
    }
    //你应该多看看C#的继承和成员访问控制,冒昧的说一句,你书没看好,OO基本知识十分不扎实。
      

  9.   


    很高兴接受你的批评,我想说我书还是看了比较多的,只是书上都是说protected可以在派生类中访问到,而我对这句话只是没能很好的理解进去
      

  10.   

    你的最后一句说:问题的本质就是你在类的实体对象中访问类的保护成员了。
    那base为什么能访问到,base应该也是一个实体对象(在创建派生类实例时先创建基类实例)
      

  11.   


    你这个method()方法是在son里声明的,
    所以obj2应该跟this有点关系吧
      

  12.   

    你这个回答不是又绕回去了吗?这样也算关系,那我主题中的那个代码也变得obj跟this有关系了
      

  13.   

    son obj2=new son(); 
          name2=obj2.name; 
    因为是在son里声明son对象,所以跟this有关系,如果声明的不是son对象,而是别的对象,比如father或别的,那就没关系了
      

  14.   

    son继承了father,son当然也有name属性,所以son obj2=new son(); 
          name2=obj2.name;实际上访问到的是son自己的属性,只是这个值从father继承而来
      

  15.   


    public class father 

      protected string name="name1"; 

    public class son:father 

      public void method() 
      { 
          father obj=new father(); 
          string name2=obj.name;//这里为什么obj访问不到name 
          name2=base.name;//这个可以访问到 
           son obj2=new son(); 
          name2=obj2.name; 
      } 
    }还是要搞清定义
    先复习一下关键字protected 的定义:受保护成员在它的类中可访问并且可由派生类访问。
    仅当访问通过派生类类型发生时,基类的受保护成员在派生类中才是可访问的。
    因为obj2.name是通过派生类来访问的,所以能访问到。
    其实private私有型变量也是这样,如果在Father类中有一个
    private string s="";
    Father father = new Father();
    这时father.s也是访问不到的
      

  16.   

    兄台此话差矣,obj2.name访问的不是自己的属性,而是基类Father的name属性。
    Son继承了name属性没错,但是Son的实例对象是访问不到自己本身的受保护属性的。
    由于Son是Father的派生类,所以按照上面复习的定义是能访问到的Father中的受保护成员。而Father father = new Father(); 
    这个father 是访问不到自己的受保护对象的,就像是访问不到自己的私有变量一样
    因为father 不是Father的派生类
    不过受保护成员在它的类中可访问
    而不能用实例出来的father 对象来访问
    OVER 可以结贴了
      

  17.   


    兄台那请问base.name这样的访问是通过什么来访问的?
      

  18.   

    不试还不知道,我之前也一直理解错误。
    原来声明成protected的成员必须在其所在的类的内部访问,
    如果在其类的外部访问的话,必须是其子类的内部。在子类的内部有几种访问形式:假设B是声明了保护实例成员M的基类,并假设D继承自B。那么在D的类主体内部,可以通过下列形式之一来访问M:一个M形式的非限定类型名或者基础表达式。
    一个E.M形式的基础表达式,这里E的类型是T或者T的子类,而T是类类型D,或者从D构造出来的类类型。
    一个base.M形式的基础表达式。
    在本类的内部声明一个本类类型的实例或本类子类的实例,这个实例还可以访问private成员。
    public class father 

      protected string name="name1"; 
      private int age=23;
      public void fatherMethod()
      {
          son s=new son();
         string str= s.name;//可以访问
         int a= s.age;//可以访问
      }

    public class son:father 

      public void method() 
      { 
          father obj=new father(); 
          string name2=obj.name;//这里访问不到是因为已经在name定义的类外面了。
          name2=base.name;//这个可以访问到 
           son obj2=new son(); 
          name2=obj2.name; 
      } 
    }也就是在本类之外通过实例.形式不能访问public 之外的成员。除非这个实例是本类类型,也就是说是本类的实例或本类子类的实例。
    可参考:http://book.51cto.com/art/200911/160234.htm
      

  19.   

    name2=base.name;//这个可以访问到 分析一下这行代码:弄清base是什么就搞定了
        首先这行代码是在Son类的method() 方法里的,
        那么这里的base的所属是son,也就是son的base,也就是this.base,
        而通过son的base来访问Father类中的name属性,就==通过son(Father的派生类)来访问Father这个基类中的受保护成员name,由Protected的定义可见,这样是可以访问的。name2=base.name;
    其实这行代码是把this给省略了
    写全了就好理解了,还是通过son这个派生类来访问的Father中的受保护成员name
    name2=this.base.name;//这样写全了一样
      

  20.   

    name2=this.base.name;//这样写全了一样 
    好像不能这样写,反正可以这样理解,特此纠正,以防误人子弟
    name2=base.name;//就相当于通过派生类来访问基类的受保护成员,所以是可以访问的到的。
      

  21.   

    看这个,其实没那么复杂:
        public class father
        {
            protected string name = "name1";
        }
        public class son : father
        {
            public void method()
            {            Console.WriteLine(name);
                
            }
        }
            class Program
            {
                static void Main(string[] args)
                {
                    son s = new son();
                    s.method();
                    
                }
                    
            }