首页 > 解决方案 > 尝试使用基类对象访问派生类中的受保护成员

问题描述

此行给出错误:无法 BaseClass.number通过类型BaseClass的限定符访问受保护的成员,限定符必须是类型DerivedClass(或从它派生)有人可以帮我解决这个问题。提前查看下面的代码

using System;
public class BaseClass
{
    protected int number = 10;
}
public class DerivedClass: BaseClass
{   
    public void Print()
    {
        BaseClass obj = new BaseClass();
        //Console.WriteLine(obj.number); 
    // we get error if we try to print why?
    }
}
class Program
{
    public static void Main()
    {
        DerivedClass obj2 = new DerivedClass();
        obj2.Print();
    }
}

但是为什么编译器会出错。为什么这种调用方法的方式是错误的

标签: c#asp.netc#-4.0

解决方案


您的问题似乎反映了文档中的这个示例

仅当通过派生类类型进行访问时,才能在派生类中访问基类的受保护成员。

public class DerivedClass : BaseClass
{   
    public void Print()
    {
        BaseClass baseClass = new BaseClass();
        DerivedClass derived = new DerivedClass();

        // This is ok
        Console.WriteLine(number); 

        // So is this
        Console.WriteLine(derived.number);

        // But you can't do this
        Console.WriteLine(baseClass.number); 
    }
}

如果没有此限制,可能会出现以下情况,这显然是一个安全漏洞:

public class AnotherDerivedClass : BaseClass
{
    public bool IsValid => number == 10;
}

public class DerivedClass : BaseClass
{   
    public void Print()
    {
        BaseClass anotherAsBase = new AnotherDerivedClass();

        anotherAsBase.number = 0;
    }
}

在上面的例子中, 的一个实例DerivedClass干扰了 的实现细节AnotherDerivedClass。作为DerivedClass与 完全不同的类型AnotherDerivedClass,它不应该这样做。


推荐阅读