为啥我不能访问子类中的受保护变量?

Posted

技术标签:

【中文标题】为啥我不能访问子类中的受保护变量?【英文标题】:Why can't I access protected variable in subclass?为什么我不能访问子类中的受保护变量? 【发布时间】:2011-10-06 17:53:42 【问题描述】:

我有一个带有受保护变量的抽象类

abstract class Beverage

        protected string description;


我无法从子类访问它。 Intellisense 没有显示它可以访问。为什么会这样?

class Espresso:Beverage

    //this.description ??

【问题讨论】:

错误信息是什么?你能发布失败的行吗?因为它现在被注释掉了,所以它不会因为它不在任何方法中而编译。 没有错误信息。它只是在课堂上无法访问。正如答案所暗示的那样,它可以在方法内部访问。 嗯,实际上,nothing 可以通过外部方法访问。如果它是public 而不是protected,则以完全相同的方式失败。 谢谢弗拉德。我会记住这一点的。 【参考方案1】:

简答:description 是一种特殊类型的变量,称为“field”。您可能希望阅读字段on MSDN。

长答案:您必须访问子类的构造函数、方法、属性等中的受保护字段。

class Subclass

    // These are field declarations. You can't say things like 'this.description = "foobar";' here.
    string foo;

    // Here is a method. You can access the protected field inside this method.
    private void DoSomething()
    
        string bar = description;
    

class 声明中,您声明了类的成员。这些可能是字段、属性、方法等。这些不是要执行的命令语句。与方法中的代码不同,它们只是告诉编译器类的成员是什么。

在某些类成员中,例如构造函数、方法和属性,是您放置命令式代码的地方。这是一个例子:

class Foo

    // Declaring fields. These just define the members of the class.
    string foo;
    int bar;

    // Declaring methods. The method declarations just define the members of the class, and the code inside them is only executed when the method is called.
    private void DoSomething()
    
        // When you call DoSomething(), this code is executed.
    

【讨论】:

@Ufuk:查看我对原始答案的修改。一定要了解调用方法时执行的类成员代码之间的区别——这是面向对象编程中非常重要的概念!【参考方案2】:

您可以从方法中访问它。试试这个:

class Espresso : Beverage

    public void Test()
    
        this.description = "sd";
    

【讨论】:

抽象与此无关。 @Steven: 还有protected。 :-)

以上是关于为啥我不能访问子类中的受保护变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能访问派生构造函数的成员初始化列表中继承的受保护字段?

为啥另一个包中的子类不能访问受保护的方法?

我们可以在父类的帮助下访问不同包中的受保护变量吗?

Java中的间接子类无法访问的超类中的受保护成员

Java - 子类中的受保护变量是啥类型?

无法访问子类中的受保护方法[重复]