为什么我不使用"受保护"的工作?

Mir*_*ria 4 c# protected

我已经读过可以从派生类访问受保护的成员,但以下内容不起作用.

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++也有这个规则.

这条规则经常被误解.有关此规则的更深入分析以及受保护访问的一些其他后果,请参阅有关此主题的文章.我已经写了关于此议题的最恰当的文章是这一个这一个.我在这里写了很多关于相关主题的文章(尽管其中一些文章偏离了受保护访问本身的主题,并涉及如何使用受保护访问来构建具有父引用的数据模型的主题.)

  • @FreeAsInBeer:嗯,您有权获得专家意见.我认为你的答案实际上没有回答这个问题.而不是回答"为什么这种使用受保护不起作用?" 就像我一样,你没有选择说"你做错了"而没有解释C#的哪个规则导致错误.我经常收到这个问题; 它是语言设计和类型安全的一个微妙点. (9认同)
  • @marc_s:虽然我接受了你的观点 - 当我第一次回答关于编程语言设计的问题时,三年级的人试图让我学习是非常有趣的 - 让我们记住StackOverflow是一个基于社区的系统.答案由社区根据他们认为的正确性和有用性来判断,而不是根据提供答案的人所谓的凭据来判断.如果年轻的大师比尔认为我已经给出了废话答案,他肯定有权得到他的意见,我们不应该否认他. (9认同)
  • @FreeAsInBeer:我真诚的建议是深呼吸,不要那么情绪化.这是一个社区网站,我们都在这里通过帮助彼此解决技术问题来帮助和相互学习.编程很好,语言很复杂,而且讽刺对任何人都没有帮助. (7认同)
  • @FreeAsInBeer:你知道**Eric Lippert是谁,对吧? (5认同)