کپسوله کردن (Encapsulation)

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

   1: using System;
   2: 
   3: public class Test
   4: {
   5:     public int five = 5;
   6: 
   7:     public int AddFive(int number)
   8:     {
   9:         number += five;
  10:         return number;
  11:     }
  12: }
  13: 
  14: public class Program
  15: {
  16:     public static void Main()
  17:     {
  18:         Test x = new Test();
  19: 
  20:         x.five = 10;
  21:         Console.WriteLine(x.AddFive(100));
  22:     }
  23: }
110

متد داخل کلاس Test به نام AddFive دارای هدف ساده‌ای است و آن اضافه کردن مقدار 5 به هر عدد می‌باشد. در داخل متد Main() یک نمونه از کلاس Test ایجاد کرده‌ایم و مقدار فیلد آن را از 5 به 10 تغییر می‌دهیم (در اصل نباید تغییر کند چون ما از برنامه خواسته‌ایم هر عدد را با 5 جمع کند ولی کاربر به راحتی آن را به 10 تغییر می‌دهد). همچنین متد AddFive() را فراخوانی و مقدار 100 را به آن ارسال می‌کنیم. مشاهده می‌کنید که قابلیت متد AddFive() به خوبی تغییر می‌کند و شما نتیجه متفاوتی مشاهده می‌کنید. اینجاست که اهمیت کپسوله سازی مشخص می‌شود. اینکه ما در درسهای قبلی فیلدها را به صورت public تعریف کردیم و به کاربر اجازه دادیم که در خارج از کلاس به آنها دسترسی داشته باشد کار اشتباهی بود. فیلدها باید همیشه به صورت private تعریف شوند.