سی شارپ - کپسوله سازی

کپسوله کردن به معنی "قرار دادن یک یا چند آیتم در یک package منطقی یا فیزیکی است" . کپوسله کردن ، در برنامه نویسی شی گرا به معنی محدود کردن دسترسی به جزییات داخل یک package است.

انتزاع و کپسوله سازی در برنامه نویسی شی گرا مشخصه های مرتبط به هم هستند.Abstraction به کاربر اجاه می دهد داده های مربوط به هم را نمایش بدهند و کپسوله کرن امکان پیاده سازی Abstraction را فراهم می کند

کپسوله سازی با استفاده از تعیین کننده ی دسترسی ها ( access specifier)اعمال می شود. به وسیله ی تعیین کننده ی دسترسی ، می توان محدوده ای که یک عضو از کلاس قابل مشاهده و دسترسی است را تعریف کرد. در سی شارپ access specifier های زیر وجود دارند

  • Public
  • Private
  • Protected
  • Internal
  • Protected internal

اصلاحگر یا تعیین کننده ی دسترسی Public

دسترسی public به یک کلاس اجازه می دهد متغیر ها و توابعش را در دسترس بقیه ی توابع و اشیا قرار بدهد.همینطور یک عضو 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 به صورت عمومی تعریف شده اند بنابراین می توانند توسط شی ء ی که از کلاس Rectangle در متد Main ساخته شده مورد دسترسی قرار بگیرند.

همینطور توابع Display() و GetArea() نیز به صورت عمومی تعریف شده اند و می توانند بدون نیاز به وهله سازی از کلاس و به طور مستقیم از این متغیر ها استفاده کنند..

تابع Display() نیز به صورت عمومی تعریف شده و میتواند توسط وهله ای که از کلاس Rectangle ساخته شده در متد Main مورد دسترسی قرار بگیرد.

اصلاحگر یا تعیین کننده ی دسترسی Private

دسترسی private این امکان را برای یک کلاس فراهم می کند تا متغیر ها یا توابع خود را از دید اشیا و توابع دیگر مخفی نگه دارد.فقط توابع یک کلاس میتوانند به اعضای 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();
      }
   }
}

نتیجه ی اجرای کد بالا به شکل زیر خواهد بود

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

در مثال بالا متغیر های length و width به صورت private تعریف شده اند ، بنابراین قابل دستیابی از تابع Main برنامه نیستند.توابع AcceptDetails() و Display() می توانند به این متغیر ها دسترسی داشته باشند .و از آنجایی که این توابع به صورت عمومی تعریف شده اند می توانند در Main و توسط شی r که از Rectangle ساخته شده، مورد دسترسی قرار بگیرند

تعیین کننده ی دسترسی Protected

دسترسی نوع Protected به فرزندان یک کلاس اجازه می دهد که به توابع و یا متغیر های Protected پدرشان دسترسی داشته باشند. توسط این ویژگی می توانیم ارث بری را پیاده سازی کنیم. در این مورد در فصب ارث بری توضیحات بیشتری ارایه خواهد شد

تعیین کننده ی دسترسی Internal

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

برنامه ی زیر این ویژگی را نشان می دهد

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

دسترسی Protected Internal به یک کلاس این اجازه را می دهد که متغیر ها و یا توابع خود را از دید هر بخش .از برنامه ی جاری به جز فرزندانش، مخفی کند.از این امکان نیز در پیاده سازی ارث بری استفاده می شود