【问题标题】:Why Protected Members are only accessible by methods of Derived Class [duplicate]为什么受保护的成员只能通过派生类的方法访问[重复]
【发布时间】:2011-11-30 11:16:57
【问题描述】:

我有父类:

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 或方法只能通过派生类方法访问,而不能直接在类中访问。

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

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

但保护级别再次出现错误。我将 var 设置为受保护,为什么派生类的对象无法访问它?

我需要清除我的 OOP 基础知识,但卡在这里。

【问题讨论】:

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


    【解决方案1】:

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

    因此,这将在班级级别上起作用:

    int x = 10;
    

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

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

    【讨论】:

    • 你忘了说这样基本字段会被覆盖。
    • @YvesM.: 它是用什么方式覆盖的?我并不是建议添加一个新字段。我的建议是,OP 应该“为它创建一个方法,或者如果你希望它在对象构造上运行,则将你的赋值放在类构造函数中”。
    • 如果你不过这个代码 int x = 10;在派生类中...
    • @YvesM.:但这不是我在回答中所说的。
    【解决方案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# 语言规范会很好。它会让你的理解更清楚。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2013-03-05
            • 2012-05-26
            • 2019-08-27
            • 2018-11-27
            • 1970-01-01
            • 2015-12-30
            • 2019-01-20
            相关资源
            最近更新 更多