2016-09-16 70 views
2

首先,这里是代码,结果是什么期待:C#:访问修饰符化妆方法调用不同

代码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()访问修饰符从publicprotected,事情变得出的期望:

代码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,为什么结果变得不同?

回答

3

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

+0

只是为了澄清,在这种情况下将'Base.Run'更改为'protected'并不会改变任何事情 - 它对所有'Base'成员都是可见的。 – kiziu

2

main功能是Base,并已获得公共/私有/受保护成员的Base实例,并获得公众成员的DerivedClass实例。