为什么受保护的成员只能通过派生类的方法访问

时间:2011-10-04 07:33:48

标签: c# .net oop inheritance derived-class

我有父类:

class clsTestParent
    {
        protected int x;

        public void Foo()
        {
            x = 10;
        }

    }

我的Derrived Class如下:

class clsDerivedTest : clsTestParent
    {

            x = 10;
            Foo();

    }

但这不起作用,因为我遇到了两个错误:

  

类,结构或接口成员声明中的无效标记'='   方法必须具有返回类型

但是当我尝试将它们与派生类中的方法一起使用时,上述语句可以正常工作,如下所示:

 class clsDerivedTest : clsTestParent
    {


        public void myTestMethod()
        {
            x = 10;
            Foo();
        }
}

为什么受保护的var或方法只能通过使用派生类方法访问,但不能在类中直接访问。

我甚至尝试通过创建对象来访问受保护的成员,如下所示:

clsDerivedTest objDerivedTest = new clsDerivedTest();
            objDerivedTest.x = 10;

但是再次获得保护级别的错误。我有var作为保护,所以为什么派生类的对象不能访问它?

我需要清除我的OOP基础知识,但要坚持到这里。

5 个答案:

答案 0 :(得分:5)

嗯,除了初始化者之外,方法体是唯一可以执行代码的地方。您的语句x = 10;是一个赋值表达式,应该放在方法体中。

所以,这可以在班级一级工作:

int x = 10;

因为它是字段声明加上初始化程序。但是一个简单的赋值语句不起作用。可以这样想:如果你把x = 10;放在你的班级中间,在每个方法之外,什么时候会运行?没有办法“调用”它。

为它创建一个方法,或者如果你希望它在对象构造上运行,可以将你的赋值放在类构造函数中。

答案 1 :(得分:2)

你知道你的问题 - 我需要清除我的OOP基础知识,但要坚持到这里。

明确受保护成员的概念:

protected关键字是成员访问修饰符。受保护的成员可以在声明它的类中访问,也可以从派生自声明该成员的类派生的任何类中访问。

class A 
{
   protected int x = 123;
}

class B : A 
{
   void F() 
   {
      A a = new A();  
      B b = new B();  
      a.x = 10;   // Error
      b.x = 10;   // OK
   }
}

此外,如果您通过C#语言规范将会很好。这将使你的理解清晰。

答案 2 :(得分:1)

你不能在c#中调用类体中的函数。

答案 3 :(得分:1)

“为什么受保护的var或方法只能通过使用派生类方法访问,但不能在类中直接访问。”您要做的是直接在类体中添加代码。这不起作用。现在有OO语言允许这样做。

要将x初始化为10,您可以使用类的构造函数...

class clsDerivedTest : clsTestParent     
{           
    public clsDerivedTest()         
    {             
        x = 10;             
    } 
}

答案 4 :(得分:0)

除了一些变量声明之外,所有内容都进入方法体。调用方法进入方法体。 如果您有多个类,则使用方法进行通信。