受保护的函数在派生类中不可访问

时间:2014-10-13 05:59:32

标签: c# inheritance

我正在制作一个简单的C#控制台应用程序来测试继承,但是当我添加2个新类并继承另一个(Mammal:Animal)并在Program.cs类中创建一个哺乳动物对象时,我不知道

Program.cs的

Mammal mam = new Mammal();

mam.see(only public function are showing of animal not the protected member of function)

Animal.cs

class Animal
{
protected void check()
{}
public void see()
{}
}

Mammal.cs

class Mammal:Animal
{
public void hair()
{}
}

无法弄清楚它不允许的原因,因为受保护允许继承它们是否在其层次结构中。

3 个答案:

答案 0 :(得分:3)

Mammals中的代码可以访问Animals的受保护成员,但只能通过Mammals类型的表达式或子类型。

外部这个类 - 我认为这是 - 无法访问受保护的成员。

从C#5规范的第3.5.3节(强调我的):

  

当在声明它的类的程序文本之外访问protected实例成员时,以及在程序的程序文本之外访问protected internal实例成员时声明,访问必须在类声明中进行,该类声明派生自声明它的类。此外,访问需要通过该派生类类型的实例或从其构造的类类型进行。

(正如Jonathan Reinhart所说,顺便说一句,你几乎肯定希望这些类型被称为MammalAnimal。)

答案 1 :(得分:1)

以下是在派生类

中访问受保护方法的方法
     class Animal
     {
       protected void check()
       {}
       public void see()
       {}
     }

    class Mammal:Animal
    {
      public void CallSee()
        {
            Animal obja = new Animal();
            obja.see();
        }
    }

现在你可以创建类Mammal的实例并调用方法callSee,它将依次调用see的Animal方法。如上所述,答案建议检测到的成员在派生类之外是不可访问的。它只能在派生类

中访问

在Main Function中写下代码。

    Static Main()
    {
      Mammal objm= new Mammal();
      objm.CallSee();
    }

答案 2 :(得分:0)

protected访问修饰符只能在声明类或其子类中访问...只有publicinternal才能从外部访问方法