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

本文关键字:派生 方法 访问 受保护 成员 为什么 | 更新日期: 2023-09-27 18:10:26

我有父类:

class clsTestParent
    {
        protected int x;
        public void Foo()
        {
            x = 10;
        }
    }

我有如下的派生类:

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

但这是不工作,因为我得到以下两个错误:

类、结构或接口成员声明中无效的令牌"="
方法必须具有返回类型

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

 class clsDerivedTest : clsTestParent
    {

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

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

我甚至尝试通过创建如下对象来访问Protected成员:

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

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

我需要清除我的oop基础知识,但停留在这里。

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

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

因此,这将在类级别上工作:

int x = 10;

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

为它创建一个方法,或者如果你想让它在对象构造中运行,就把你的赋值放在类构造函数中。

你知道你的问题-我需要清理我的面向对象的基础知识,但困在这里。

清除受保护成员的概念:

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

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#语言规范将会很好。这会让你理解得更清楚。

"为什么受保护的var或方法只能通过派生类方法访问,而不能直接在类中访问。"您要做的是直接在类主体中添加代码。这行不通。现在有oo语言允许这样做。

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

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

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

除了一些变量声明外,所有内容都放在方法体中。调用方法进入方法体。当你有一个以上的类时,它们之间的通信是通过使用方法来实现的。