2016-09-16 71 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實例。