مخفی کردن متد (Method Hiding)

همانطور که می دانید وقتی یک کلاس از کلاس دیگر ارث بری می‌کند، به تمام اعضای public آن کلاس دسترسی می‌یابد. اما در برخی موارد، ممکن است کلاس فرزند دارای متدی باشد که نام و امضای آن شبیه به متدی در کلاس پدر باشد. حال اگر یک شیء از کلاس فرزند ایجاد و متد را فراخوانی کنید، در اصل متد کلاس فرزند فراخوانی می‌شود، چونکه کامپایلر سی شارپ به طور خودکار متد کلاس پایه را مخفی می‌کند. هر چند که سی شارپ این کار را خودکار انجام می‌دهد ولی بهتر است شما این کار را به صورت دستی و با اضافه کردن کلمه کلیدی new قبل از نوع برگشتی متد انجام دهید، به این کار مخفی کردن متد یا Method Hiding می گویند، چون که شما عمداً متد کلاس پایه را مخفی کرده‌اید :

   1: using System;
   2: 
   3: namespace Program
   4: {
   5:     class Parent
   6:     {
   7:         public void ShowMessage()
   8:         {
   9:             Console.WriteLine("Method from Base Class");
  10:         }
  11:     }
  12: 
  13:     class Child : Parent
  14:     {
  15:         public new void ShowMessage()
  16:         {
  17:             Console.WriteLine("Method from Derived Class");
  18:         }
  19:     }
  20: 
  21:     class Program
  22:     {
  23:         static void Main(string[] args)
  24:         {
  25:             Child child1 = new Child();
  26:             child1.ShowMessage();
  27:         }
  28:     }
  29: }
Method from Derived Class

ممکن است که این سؤال برای شما پیش آمده باشد که اگر بخواهیم متد کلاس پایه را فراخوانی کنیم، باید چکار کنیم؟ سه روش برای این کار وجود دارد. اولین روش استفاده از کلمه کلیدی base است. خط 17 را به صورت زیر تغییر داده و برنامه را اجرا کنید :

base.ShowMessage();
Method from Base Class

روش دوم تبدیل صریح شیء ایجاد شده از کلاس مشتق به وسیله کلاس پایه است. خط 26 را به صورت زیر تغییر داده و برنامه را اجرا کنید :

((Parent)child1).ShowMessage();
Method from Base Class

روش سوم، دادن ارجاعی از کلاس پایه به شیء کلاس مشتق است. خطوط 26-25 را به صورت زیر تغییر داده و برنامه را اجرا کنید :

Parent parent = new Child();
parent.ShowMessage();
Method from Base Class

حال که با بازنویسی (Overriding) و مخفی کردن (Hiding) متدها آشنا شدید، بهتر است که با تفاوت این دو آشنا شوید. در Overriding اگر یک ارجاع از کلاس پایه به کلاس مشتق بدهیم، متد کلاس مشتق ولی در Hiding، متد کلاس پایه فراخوانی می‌شود.