c# - 尝试使用基类对象访问派生类中的受保护成员
问题描述
此行给出错误:无法 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();
}
}
但是为什么编译器会出错。为什么这种调用方法的方式是错误的
解决方案
您的问题似乎反映了文档中的这个示例。
仅当通过派生类类型进行访问时,才能在派生类中访问基类的受保护成员。
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
,它不应该这样做。
推荐阅读
- c++ - 如何检查一行中的第二个字符串是否为数字?
- python - 用户按下所有答案后如何在python中结束循环?
- java - 用 JDK 11 替换 wsimport
- r - 带有条件逻辑错误的嵌套并行处理
- dataframe - 从 SQL 表转换为 SAS 数据?
- sql-server - 获取带有时间戳的当周记录数
- c# - CORS 策略已阻止从源访问“http://localhost...”处的 XMLHttpRequest:
- caching - 为什么 Concrete5 网站在运行 c5:clear-cache 后回答错误 500?
- java - 我需要有关阅读来自 SQLite 的登录电子邮件的帮助
- python - 在python中发送击键SHIFT + PRINTSCREEN