我已经读过可以从派生类访问受保护的成员,但以下内容不起作用.
class A
{
protected int Test;
}
class B:A
{
A instanceOfA= new A()
public B()
{
instanceOfA.Test //Not possible
}
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ert 26
我已经读过可以从派生类访问受保护的成员.为什么我使用"受保护"不起作用?
这是非法的,因为您没有保证您正在访问"B"实例的数据.考虑这种类似的情况:
abstract class BankAccount
{
protected int accountNumber;
}
class SwissBankAccount : BankAccount
{
}
--- in another assembly, evil-doers write ---
class EvilBankAccount : BankAccount
{
void DoEvil()
{
BankAccount b = GetASwissBankAccount();
int number = b.accountNumber;
}
}
Run Code Online (Sandbox Code Playgroud)
EvilBankAccount不从SwissBankAccount继承,因此不允许在EvilBankAccount中使用SwissBankAccount的受保护成员.您可以访问"父母"的受保护成员,但不能访问"兄弟姐妹"!EvilBankAccount只能访问受保护成员EvilBankAccount的(或从EvilBankAccount派生的类型).SwissBankAccount的受保护成员不受限制.
规则是受保护实例成员通过其访问的"receiver"表达式的类型必须至少与包含成员访问权限的类型声明一样派生.有关规则的准确措辞和一些说明性示例,请参阅C#4.0规范的第3.5.3节.
顺便说一句,C++也有这个规则.
这条规则经常被误解.有关此规则的更深入分析以及受保护访问的一些其他后果,请参阅有关此主题的文章.我已经写了关于此议题的最恰当的文章是这一个和这一个.我在这里写了很多关于相关主题的文章(尽管其中一些文章偏离了受保护访问本身的主题,并涉及如何使用受保护访问来构建具有父引用的数据模型的主题.)
| 归档时间: |
|
| 查看次数: |
570 次 |
| 最近记录: |