日期:2014-05-18  浏览次数:20805 次

【求高手指点】C#中protected用法和private用法怎么有些地方这么相同??
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;
  }
  }
}





------解决方案--------------------
开玩笑。

你老酒喝多了?这个和什么private以及prodected都没有关系。

原因是你根本就没搞清楚限定符是做什么的。

比如说private,它的作用是使得成员变量私有。成员变量是什么???怎么可能是另一个对象的成员变量呢?

比如说:
C# code
class A
{
    private int a = 0;
    public void foo(A other_a)
    {
        a = 1; // a是成员变量
         other_a.a = 2; // error, 这个a分明是另一个对象的,关成员变量什么事情?!
    }
}