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

时间:2011-04-12 15:47:11

标签: c# protected

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

class A
{
    protected int Test;
}
class B:A
{
    A instanceOfA= new A()

    public B()
    {
        instanceOfA.Test //Not possible
    }
}

7 个答案:

答案 0 :(得分: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;
    }
}

EvilBankAccount不会从SwissBankAccount继承,因此不允许在EvilBankAccount中使用SwissBankAccount的受保护成员。您可以访问“父母”的受保护成员,但不能访问“兄弟姐妹”! EvilBankAccount只能访问受保护的成员的EvilBankAccount (或从EvilBankAccount派生的类型)。 SwissBankAccount的受保护成员不受限制。

规则是受保护实例成员访问的“receiver”表达式的类型必须至少与包含类型声明一样派生。会员访问。有关规则的准确措辞和一些说明性示例,请参阅C#4.0规范的第3.5.3节。

顺便说一下,C ++也有这个规则。

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

答案 1 :(得分:2)

您尚未正确设置代码。类B不应具有类A的实例。相反,类B本身会继承类A中的受保护变量。

您的代码应该更像:

class A
{
   protected int Test;
}
class B:A
{
   public B()
   {
       int someInt = this.Test;
   }
}

答案 2 :(得分:2)

您可以访问Test类中的B int。但是,您无法访问实例的属性。 A不知道它是B的孩子,因此不会访问其财产。

class A
{
    protected int Test;
}
class B : A
{
    public B()
    {
       Test = 3; //possible
       base.Test = 3;  //explicitly calling base member, but not necessary in this case
    }
}

答案 3 :(得分:2)

子类可以访问标记为protected他们自己的继承成员。

class A
{
   protected int Test;
}

class B : A
{
   public B()
   {
     this.Test = 42; // Possible
   }
}

答案 4 :(得分:2)

由于B已经从A继承,因此您不需要A的单独实例。

   public B()
   {
     this.Test = 1; //possible
   }

答案 5 :(得分:2)

您可以通过同一个类访问它,而不是基类的公共成员。

class A 
{ 
    protected int Test; 
} 

class B:A 
{ 
    void TestMethod()
    {
         this.Test = 3; // Possible
    }
}

在C#中检查protected访问修饰符。

答案 6 :(得分:2)

如果您继承A,则无需创建A的实例。

class A
{
   protected int Test;
}
class B:A
{
   public B()
   {
     this.Test = 666;
   }
}