C#:访问修饰符使方法调用不同

C#: Access modifier make method invoke differently

首先,这是代码,结果是预期的:

代码 1:

using System;

namespace ConsoleApplication11
{
    class DerivedClass : Base
    {
        public new void Run()
        {
            Console.WriteLine("Derived class");
        }
    }

    class Base
    {
        public void Run()
        {
            Console.WriteLine("Base class");
        }
       
        static void Main(string[] args)
        {
            DerivedClass dc = new DerivedClass();
            Base bc = new Base();

            dc.Run();
            bc.Run();
        }
    }
}

结果 1:

Derived class

Base class


但是,如果我将两个 classes 的 Run() 访问修饰符从 public 更改为 protected,事情就会出乎意料:

代码 2:

using System;

namespace ConsoleApplication11
{
    class DerivedClass : Base
    {
        protected new void Run()
        {
            Console.WriteLine("Derived class");
        }
    }

    class Base
    {
        protected void Run()
        {
            Console.WriteLine("Base class");
        }
       
        static void Main(string[] args) 
        {
            DerivedClass dc = new DerivedClass();
            Base bc = new Base();

            dc.Run();
            bc.Run();
        }
    }
}

结果 2:

Base class

Base class

我的问题是,在protected也允许派生class访问基class作为public的情况下,为什么结果会不同?

DerivedClass.Run 受到保护,所以 Base 甚至看不到它。它调用继承自 BaseRun 方法。

您的 main 函数在 Base 中,并且可以访问 Base 实例上的 public/private/protected 成员以及访问 public 实例上的成员DerivedClass.

实例