2016-09-16 11 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:派生

をクラス

ベースクラス


しかし、私はpublicからprotectedに二つのクラスRun()アクセス修飾子の両方を変更した場合、事はアウトの期待になった:

コード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のインスタンス上のパブリックメンバーへのアクセスに関するパブリック/プライベート/保護されたメンバーへのアクセス権を持っています。

関連する問題