【问题标题】:C#: Access modifier make method invoke differentlyC#:访问修饰符使方法调用不同
【发布时间】:2016-09-16 12:50:20
【问题描述】:

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

代码 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:

派生类

基类


但是,如果我将两个类的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:

基类

基类

我的问题是,在protected也允许派生类以public访问基类的情况下,为什么结果会不一样?

【问题讨论】:

    标签: c# access-modifiers


    【解决方案1】:

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

    【讨论】:

    • 澄清一下,在这种情况下,将 Base.Run 更改为 protected 并不会改变任何事情 - 它仍然对所有 Base 成员可见。
    【解决方案2】:

    您的main 函数位于Base 中,并且可以访问Base 实例上的公共/私有/受保护成员以及DerivedClass 实例上的公共成员。

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 2011-04-13
      • 2015-11-27
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 2015-12-24
      相关资源
      最近更新 更多