在派生类中无法访问受保护的函数

本文关键字:访问 受保护 函数 派生 | 更新日期: 2023-09-27 18:26:16

我正在制作一个简单的C#控制台应用程序来测试继承,但当我添加两个新类并相互继承时(Mammal:Animal),并在Program.cs class I-e 中制作一个哺乳动物对象

程序.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()
{}
}

哺乳动物

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

无法弄清楚为什么它不允许,因为protected允许在其层次结构中继承。

在派生类中无法访问受保护的函数

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

从外部的类(我认为是这样)无法访问受保护的成员。

来自C#5规范第3.5.3节(重点矿井):

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

(正如Jonathan Reinhart所指出的,您几乎肯定希望这些类型被称为MammalAnimal。)

下面是访问派生类中受保护方法的方法

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

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

在主功能中写下以下代码。

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

protected访问修饰符只能从声明类或其子类中访问。。。只有publicinternal使方法可以从外部访问