RunningCSharp

MS系開発者による、雑多な記事。記事は所属企業とは関係のない、個人の見解です。

C#:継承とメソッドの隠蔽で、privateスコープからのアクセス時のみメソッド実装を変える

基底クラスのpublicなメソッドに対し、派生クラスでnewキーワードを用いてprivateなメソッドとして隠蔽を行なうと、

クラス外から呼び出した場合(publicなスコープでのアクセス時)は基底クラスの実装で動作し、

クラス内から呼び出した場合(privateなスコープでのアクセス時)は派生クラスの実装で動作しました。

class Program
{
   static void Main(string[] args)
   {
       Console.WriteLine(new BaseClass().MyMethod());
       Console.WriteLine(new SuperClass().MyMethod());
       Console.WriteLine(new SuperClass().CallLocalMethod());
       Console.ReadLine();
   }

}
public class BaseClass
{
   //隠ぺい対象のメソッド
   public string MyMethod()
   {
       return "aaa";
   }
}

public class SuperClass : BaseClass
{
   //privateなメソッドで隠ぺい
   private new string MyMethod()
   {
       return "bbb";
   }
   //ローカルスコープでのMyMethodの結果を返すメソッド
   public string CallLocalMethod()
   {
       return MyMethod();
   }
}

結果:

aaa

aaa

bbb

MSDNにも記載があります。(https://msdn.microsoft.com/ja-jp/library/aa691135(v=vs.71).aspx)