کپسوله‌سازی (Encapsulation) و تعیین سطح دسترسی (Access Modifier)

10 تیر 1396
درسنامه درس 7 از سری آموزش سی شارپ (C#)
csharp-encapsulation

مطالعه‌ی شش فصل گذشته به شما کمک می‌کند تا مقدمات زبان برنامه‌نویسی C# را فراگرفته و در نهایت کدنویسی خود را آغاز کنید. حال در این فصل قصد داریم یک مقدار مباحث آموزشی را تخصصی تر کرده تا قبل از ورود به دنیای بسیار پر رمز و راز برنامه‌نویسی دقت عمل بالایی را کسب کنید تا بتوانید کدهای بهینه و در عین حال قابل دسترس را در اختیار داشته باشید. مفهومی که در این فصل در مورد آن صحبت می‌کنیم پیرامون مبحث کپسوله سازی یا Encapsulation و تعیین سطح دسترسی یا Access Modifier ها در زبان برنامه‌نویسی C# است.

مقدمه

کپسوله‌سازی یا Encapsulation در برنامه‌نویسی کامپیوتر مفهومی است که عموما در کلاس‌ها و به عنوان یکی از مبانی و اصول برنامه‌نویسی شیءگرایی (OOP که مخفف عبارت Object Oriented Programming است) می‌باشد.

به صورت روان‌تر و ساده‌تر می‌توان مطرح کرد که کپسوله سازی به معنی دسته‌بندی  (کپسوله کردن) داده‌ها و توابعی (متدها) است که روی این داده‌ها اعمال می‌شوند. به عبارت دیگر با استفاده از کپسوله سازی دسترسی مستقیم برنامه‌نویسان به متدها و سایر المان‌های یک شیء محدود می‌شود.

بالاتر از مفهوم کپسوله سازی با معنی‌ای به نام انتزاع یا Abstraction‌ آشنا می‌شویم.

انتزاع به معنای اجازه دادن به یک کاربر یا برنامه‌نویس برای مشاهده اطلاعات مربوط به یک کلاس یا شیء است و کپسوله سازی به معنای فراهم کردن توانایی یک برنامه‌نویس برای سطح‌بندی کردن این دید انتزاعی نسبت به اشیاء است.

قبل از ورود به مبحث کپسوله سازی باید خدمت شما عزیزان مطرح کنم که در فصل بعدی با مفاهیم کلاس‌ها و اشیاء به تفصیل آشنا خواهید شد و هدف از این فصل اشنا شدن شما عزیزان با مفاهیمی چون کپسوله سازی و Access Modifier ها است. بنابراین اگر کدی برای شما ناملموس است اصلا نگران نباشید زیرا در فصل بعدی به صورت کامل پوشش لازم را خواهیم داشت.

برای اجرای کپسوله سازی یا Encapsulation از تغییردهنده‌های دسترسی یا (Access Modifier) استفاده می‌کنیم. این تغییردهنده‌ها معمولا روی اعضای یک کلاس تاثیر می‌گذارند. زبان برنامه‌نویسی C# از چندین تغییردهنده دسترسی پشتیبانی می‌کند که به شرح ذیل می‌باشد:

  • دسترسی Public (عمومی)
  • دسترسی Private (خصوصی)
  • دسترسی Protected (محافظت‌شده)
  • دسترسی Internal (داخلی)
  • دسترسی Protected Internal (محافظت شده‌ی داخلی)

سطح دسترسی عمومی (Public Access Modifier)

این سطح دسترسی زمانیکه روی یک کلاس اعمال می‌شود، اعضاء و توابع متغییر آن را در اختیار سایر توابع و اشیاء می‌گذارد. هر عضو عمومی (Public) می‌تواند خارج از آن کلاس نیز در دسترس باشد. به مثال زیر توجه کنید:

using System;
namespace RectangleApplication
{
   class Rectangle
   {
      //member variables
      public double length;
      public double width;
      
      public double GetArea()
      {
         return length * width;
      }
      public void Display()
      {
         Console.WriteLine("Length: {0}", length);
         Console.WriteLine("Width: {0}", width);
         Console.WriteLine("Area: {0}", GetArea());
      }
   }//end class Rectangle
   
   class ExecuteRectangle
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle();
         r.length = 4.5;
         r.width = 3.5;
         r.Display();
         Console.ReadLine();
      }
   }
}

هنگامیکه کد بالا را اجرا کنیم با خروجی زیر مواجه خواهیم شد:

Length: 4.5
Width: 3.5
Area: 15.75

در مثال فوق همانطور که ملاحظه می‌کنید اعضایی چون length و width به صورت عمومی (public) تعریف شده‌اند و این بدین معنی‌ست که آنها در تابع دیگری تحت عنوان ()Main با استفاده از نمونه‌ای از کلاس Rectangle در دسترس می‌باشند.

در کلاس Rectangle نیز توابعی تحت عنوان Display و GetArea وجود دارند که به صورت مستقیم در تابع دیگری مانند ()Main استفاده شده اند چون دسترسی آنها نیز Public می‌باشد.

سطح دسترسی اختصاصی (Private Access Modifier)

این نوع دسترسی که دسترسی اختصاصی و شخصی معروف است زمانیکه روی یک کلاس لحاظ شود باعث می‌شود اعضا و توابع تنها درون آن کلاس در قابل استفاده باشند و از سایر کلاس‌ها مخفی بماند و قابل دسترسی نباشد. این نوع سطح دسترسی بیشترین میزان محدودیت را دارد.

توجه: در حالت پیش‌فرض کلاس‌ها با سطح دسترسی Private تعریف می‌شوند.

برای روشن‌تر این موضوع به مثال زیر توجه کنید:

using System;
namespace RectangleApplication 
{
   class Rectangle
   {
      //member variables
      private double length;
      private double width;
      
      public void Acceptdetails()
      {
         Console.WriteLine("Enter Length: ");
         length = Convert.ToDouble(Console.ReadLine());
         Console.WriteLine("Enter Width: ");
         width = Convert.ToDouble(Console.ReadLine());
      }
      public double GetArea()
      {
         return length * width;
      }
      public void Display()
      {
         Console.WriteLine("Length: {0}", length);
         Console.WriteLine("Width: {0}", width);
         Console.WriteLine("Area: {0}", GetArea());
      }
   }//end class Rectangle
   
   class ExecuteRectangle
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle();
         r.Acceptdetails();
         r.Display();
         Console.ReadLine();
      }
   }
}

همانطور که در مثال فوق ملاحظه می‌کنید تنها متدهایی که با فرمت Public ایجاد شده‌اند، خارج از آن کلاس در دسترس می‌باشند. بنابراین خروجی این مثال به صورت زیر می‌باشد:

Enter Length:
4.4
Enter Width:
3.3
Length: 4.4
Width: 3.3
Area: 14.52

سطح دسترسی محافظت شده (Protected Access Modifier)

تمام اعضا و متدهای کلاسی که با سطح دسترسی Protected ایجاد شده‌اند تنها درون آن کلاس و سایر کلاس‌هایی که از این کلاس به ارث رفته‌اند، قابل دسترس هستند. ( در ارتباط با ارث بری در فصول آینده توضیحاتی را ارائه خواهیم کرد)

سطح دسترسی داخلی (Internal Access Modifier)

این نوع سطح دسترسی اگر روی اعضا و متدهای یک کلاس لحاظ شود باعث می‌شود که آنها تنها درون پروژه جاری در دسترس باشند. به مثال زیر توجه کنید:

using System;
namespace RectangleApplication
{
   class Rectangle
   {
      //member variables
      internal double length;
      internal double width;
      
      double GetArea()
      {
         return length * width;
      }
      public void Display()
      {
         Console.WriteLine("Length: {0}", length);
         Console.WriteLine("Width: {0}", width);
         Console.WriteLine("Area: {0}", GetArea());
      }
   }//end class Rectangle
   
   class ExecuteRectangle
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle();
         r.length = 4.5;
         r.width = 3.5;
         r.Display();
         Console.ReadLine();
      }
   }
}

در نهایت این امر خروجی مثال فوق به صورت زیر می باشد:

Length: 4.5
Width: 3.5
Area: 15.75

توجه دارید که در این مثال تابع یا متد GetArea توسط هیچ یک از سطوح دسترسی تعریف نشده است و با توجه به نکته‌ای که در فوق ذکر کردیم این سطح دسترسی به صورت پیش‌فرض برابر Private خواهد بود.

سطح دسترسی محافظت شده داخلی (Protected Internal)

این حالت دقیقا مشابه حالت internal می باشد با این تفاوت که متدها و اعضای موجود در کلاسهایی که از این کلاس به ارث رفته‌اند حتی اگر در پروژه دیگری باشند، قابلیت دسترسی دارند.

بسیار عالی! در این بخش به توضیح کامل تعیین سطح دسترسی در زبان برنامه‌نویسی C# پرداختیم. در فصل آینده به معرفی کلاس‌ها و در نهایت اشیاء و متدها می پردازیم. با ما همراه باشید :)

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش سی شارپ (C#) توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.