【问题标题】:Trying to access protected member in derived class using base class object尝试使用基类对象访问派生类中的受保护成员
【发布时间】:2020-05-27 16:53:32
【问题描述】:

此行给出错误:无法通过BaseClass 类型的限定符访问受保护的成员BaseClass.number,限定符必须为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();
    }
}

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

【问题讨论】:

  • protected keyword - 只有通过派生类类型进行访问时,才能在派生类中访问基类的受保护成员。 - 它回答了您的问题吗?
  • 使用this.number代替obj.number
  • @Rafalon 它也可以在它定义的类中访问。

标签: c# asp.net c#-4.0


【解决方案1】:

您的问题似乎反映了文档中的this example

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

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 的实现细节。由于DerivedClassAnotherDerivedClass 是完全不同的类型,所以它不应该这样做。

【讨论】:

  • 是的,但你知道为什么我们不能那样做吗?为什么我们被限制这样做?
  • @AkhilKarankoti 我已经添加了限制的原因。
  • 你能解释一下为什么这是一个安全漏洞吗?
  • @AkhilKarankoti 因为它允许DerivedClass 访问AnotherDerivedClass 的受保护成员,即使它们是完全不同的类型。想象一下AnotherDerivedClass 的实现有需要number 的逻辑,但是DerivedClass 的一个实例能够改变number 的值。
  • 我明白你的意思是说'DerivedClass'中的'number'和'AnotherDerivedClass'中的'number'是一样的?。它们完全不同。因此,即使您在一个类中更改“数字”,它也不会影响另一个类,因为它们是不同的实例。
【解决方案2】:
using System;
public class BaseClass
{
    protected int number = 10;
}
public class DerivedClass : BaseClass
{
    public void Print()
    {
        this.number = 20;  // you access it as a private filed 

    }
}
class Program
{
    public static void Main()
    {
        DerivedClass obj2 = new DerivedClass();
        obj2.Print();
    }
}

【讨论】:

  • 是的,我们可以这样做,但出于好奇,为什么我们不能以这种方式(如上面的代码)访问是我需要的
  • @AkhilKarankoti stackoverflow 用于在您理解问题时提出问题,而不是质疑为什么事情会如此运作。停止投票答案。
  • 我渴望找出原因。并参加您的投票。我是新用户,还没有投票权。
猜你喜欢
  • 2014-08-27
  • 2019-01-20
  • 2012-08-29
  • 2018-11-27
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
相关资源
最近更新 更多