C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]

Posted

技术标签:

【中文标题】C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]【英文标题】:C#: Protected method in base class; unable to access using derived class object from another class [duplicate] 【发布时间】:2017-10-04 15:43:01 【问题描述】:

从基类继承的类是否可以访问基类的受保护成员?

我正在尝试使用来自另一个类的派生类的对象访问基类的受保护方法,但我收到此错误消息

the base class method is inaccessible due to protection level

我做错了什么?

程序.cs

class Program

    static void Main(string[] args)
    
        DerivedClass dc = new DerivedClass();
        dc.DisplayValue();

    

BaseClass.cs

class BaseClass

    private int value = 3;

    protected void DisplayValue()
    
        Console.WriteLine(this.value);
    

DerivedClass.cs

class DerivedClass : BaseClass

【问题讨论】:

见docs.microsoft.com/en-us/dotnet/articles/csharp/… 【参考方案1】:

DerivedClass 中的代码可以访问 BaseClass 的受保护成员,但只能通过 DerivedClass 类型或子类型的表达式。

您的 Main 函数在派生类之外,这就是您遇到异常的原因。

来自 C# 5 规范的第 3.5.3 节(重点是我的):

当一个受保护的实例成员在程序文本之外被访问时 声明它的类,以及当一个受保护的内部 在程序的程序文本之外访问实例成员 它被声明,访问必须发生在一个类中 从声明它的类派生的声明。 此外,需要通过实例进行访问 该派生类类型或由它构造的类类型。

您可以将代码更改为此,例如使用基类的受保护函数

    public class Program
    
        public static void Main(string[] args)
        
            DerivedClass dc = new DerivedClass();
            dc.Display();
        
    
    public class BaseClass
    
        private int value = 3;

        protected void DisplayValue()
        
            Console.WriteLine(this.value);
        
    
    public class DerivedClass : BaseClass
    
        public void Display()
        
            DisplayValue();
        
    

【讨论】:

【参考方案2】:

受保护的成员确实可以从派生类中看到。但是在您的示例中,您不能从派生类访问DisplayValue。您从Program 访问它,而不是 派生自BaseClass。您需要将该成员设为public

【讨论】:

以上是关于C#:基类中的受保护方法;无法使用来自另一个类的派生类对象进行访问[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我无法访问我的基类的受保护成员

无法访问基类中的受保护成员 [重复]

派生类无法访问基类的受保护方法

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

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

从派生类访问基类中的受保护成员