سه شنبه ۱۸ دي ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

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

کپسوله‌سازی (Encapsulation) - C#


 

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

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

کپسوله‌سازی با استفاده از محدودکننده‌های دسترسی پیاده‌سازی می‌شود. یک محدودکننده دسترسی حوزه و قابلیت دید یک عضو کلاس را تعریف می‌کند. زبان C#، محدودکننده‌های دسترسی زیر را پشتیبانی می‌کند −

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

محدودکننده دسترسی عمومی (Public Access Specifier)

محدودکننده دسترسی عمومی (Public Access Specifier) به یک کلاس این امکان را می‌دهد تا متغیرهای عضو و توابع عضو خود را به سایر توابع و اشیاء نمایش دهد. هر عضو عمومی از خارج از کلاس قابل دسترسی است.

مثال زیر این موضوع را نشان می‌دهد −


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 با نام r به آنها دسترسی داشت.

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

تابع عضو Display() نیز به صورت عمومی (public) تعریف شده است، بنابراین می‌توان با استفاده از یک نمونه از کلاس Rectangle با نام r به آن دسترسی داشت.

محدودکننده دسترسی خصوصی (Private Access Specifier)

محدودکننده دسترسی خصوصی (Private Access Specifier) به یک کلاس این امکان را می‌دهد تا متغیرهای عضو و توابع عضو خود را از سایر توابع و اشیاء پنهان کند. تنها توابع همان کلاس می‌توانند به اعضای خصوصی آن دسترسی داشته باشند. حتی یک نمونه از کلاس هم نمی‌تواند به اعضای خصوصی آن دسترسی پیدا کند.

مثال زیر این موضوع را نشان می‌دهد −


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() می‌توانند به این متغیرها دسترسی داشته باشند. از آنجا که توابع عضو AcceptDetails() و Display() به صورت عمومی (public) تعریف شده‌اند، می‌توان با استفاده از یک نمونه از کلاس Rectangle به نام r به آن‌ها از تابع Main() دسترسی داشت.

خصوصیت دسترسی Protected

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

خصوصیت دسترسی Internal

دسترسی‌گر داخلی (Internal access specifier) به یک کلاس اجازه می‌دهد تا متغیرها و توابع عضو خود را به سایر توابع و شی‌ها در اسمبلی کنونی فراهم کند. به عبارت دیگر، هر عضو با دسترسی‌گر داخلی می‌تواند از هر کلاس یا متدی که در برنامه تعریف شده باشد دیده شود.

برنامه زیر این را نشان می‌دهد:


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() با هیچ مشخص کننده دسترسی اعلان نشده است. بنابراین اگر هیچ کدام را ذکر نکنیم، مشخص کننده دسترسی پیش فرض یک عضو کلاس چه خواهد بود؟ خصوصی .

مشخص کننده دسترسی داخلی محافظت شده (Protected Internal Access Specifier)

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