مفهومی که در این جلسه می خواهیم در مورد آن صحبت کنیم، مبحث کپسوله سازی در سی شارپ یا Encapsulation و تعیین سطح دسترسی یا Access Modifier هاست.
مطالعهی سری آموزشی سی شارپ به شما کمک میکند تا مقدمات زبان برنامهنویسی C# را از صفر فراگرفته و در نهایت کدنویسی خود را آغاز کنید. توصیه میکنیم این سری آموزشی را مطالعه کنید.
کپسولهسازی یا Encapsulation در برنامهنویسی کامپیوتر مفهومی است که عموما در کلاسها و به عنوان یکی از مبانی و اصول برنامهنویسی شیءگرایی (OOP که مخفف عبارت Object Oriented Programming است) میباشد.
به صورت روانتر و سادهتر میتوان مطرح کرد که کپسوله سازی به معنی دستهبندی (کپسوله کردن) دادهها و توابعی (متدها) است که روی این دادهها اعمال میشوند. به عبارت دیگر با استفاده از کپسوله سازی دسترسی مستقیم برنامهنویسان به متدها و سایر المانهای یک شیء محدود میشود.
بالاتر از مفهوم کپسوله سازی با معنیای به نام انتزاع یا Abstraction آشنا میشویم.
انتزاع به معنای اجازه دادن به یک کاربر یا برنامهنویس برای مشاهده اطلاعات مربوط به یک کلاس یا شیء است و کپسوله سازی به معنای فراهم کردن توانایی یک برنامهنویس برای سطحبندی کردن این دید انتزاعی نسبت به اشیاء است.
قبل از ورود به مبحث کپسوله سازی در سی شارپ باید خدمت شما عزیزان مطرح کنم که در فصل بعدی (که در قسمت پائین همین مقاله به آن دسترسی خواهید داشت) با مفاهیم کلاسها و اشیاء به تفصیل آشنا خواهید شد و هدف از این فصل اشنا شدن شما عزیزان با مفاهیمی چون کپسوله سازی و Access Modifierها است. بنابراین اگر کدی برای شما ناملموس است اصلا نگران نباشید زیرا در فصل بعدی به صورت کامل پوشش لازم را خواهیم داشت.
برای اجرای کپسوله سازی در سی شارپ یا Encapsulation از تغییردهندههای دسترسی یا (Access Modifier) استفاده میکنیم. این تغییردهندهها معمولا روی اعضای یک کلاس تاثیر میگذارند. زبان برنامهنویسی C# از چندین تغییردهنده دسترسی پشتیبانی میکند که به شرح ذیل میباشد:
این سطح دسترسی زمانیکه روی یک کلاس اعمال میشود، اعضاء و توابع متغیر آن را در اختیار سایر توابع و اشیاء میگذارد. هر عضو عمومی (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 تعریف میشوند.
برای روشنتر این موضوع به مثال زیر توجه کنید:
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 ایجاد شدهاند تنها درون آن کلاس و سایر کلاسهایی که از این کلاس به ارث رفتهاند، قابل دسترس هستند. (در ارتباط با ارث بری در فصول آینده توضیحاتی را ارائه خواهیم کرد)
این نوع سطح دسترسی اگر روی اعضا و متدهای یک کلاس لحاظ شود باعث میشود که آنها تنها درون پروژه جاری در دسترس باشند. به مثال زیر توجه کنید:
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 خواهد بود.
این حالت دقیقا مشابه حالت internal می باشد با این تفاوت که متدها و اعضای موجود در کلاسهایی که از این کلاس به ارث رفتهاند حتی اگر در پروژه دیگری باشند، قابلیت دسترسی دارند.
بسیار عالی! در این بخش به توضیح کامل تعیین سطح دسترسی در زبان برنامهنویسی C# پرداختیم. امیدواریم که از این آموزش استفاده کافی را برده باشید. درس های بعدی آموزش سی شارپ را از قسمت پائین همین مقاله دنبال کنید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.