در این پست مفاهیم اصلی برنامه نویسی شی گرا رو نام برده و بطور ساده بیان می کنیم که هر کدام در چه شرایطی می تونن به ما کمک کنن تا بتونیم کاری رو که به نظر غیر ممکن میاد رو انجام بدیم.
با C#، شما میتونید تقریباً هر چیزی که تو ذهنتون هست رو به واقعیت تبدیل کنید. از ساختن برنامههای ساده مثل ماشینحساب گرفته تا طراحی بازیهای پیچیده، وبسایتها، اپلیکیشنهای موبایل، سیستمهای مدیریت بانک، یا حتی ابزارهایی که با هوش مصنوعی کار میکنن. فرض کنید میخواهید یه برنامه بسازید که اطلاعات دانشجوها رو مدیریت کنه، یا یه ربات که توی یه بازی خودش تصمیم بگیره کجا بره. این کارها با استفاده از مفاهیم شیگرایی خیلی منظمتر و قابلفهمتر میشن. ببینیم هر کدوم از این مفاهیم چطور به ما کمک میکنن تا این کارها رو انجام بدیم.
1 . کپسولهسازی (Encapsulation): اگه بخواهیم یه چیزی رو مخفی کنیم و فقط به شکلی که خودمون میخواهیم در دسترس بذاریم، از کپسولهسازی استفاده میکنیم. مثلاً تو برنامه مدیریت دانشجوها، فرض کنید نمیخواهیم کسی بتونه مستقیماً نمره یه دانشجو رو تغییر بده و فقط از طریق یه متد خاص با شرط (مثلاً نمره بین 0 تا 20) این کار رو بکنه. اینجا با تعریف فیلدهای خصوصی (مثل private int score) و پراپرتیها با get و set، این کنترل رو به دست میگیریم. این کار باعث میشه کد امنتر بشه و جلوی اشتباهات رو بگیره.
2 . ارثبری (Inheritance): حالا اگه بخواهیم یه کار بهظاهر غیرممکن مثل مدیریت همزمان دانشجوها، استادها و کارمندها رو تو یه سیستم انجام بدیم، از ارثبری استفاده میکنیم. مثلاً یه کلاس پایه به اسم Person میسازیم که ویژگیهای مشترک مثل اسم و کد ملی رو داره. بعد کلاسهای Student، Professor و Employee ازش ارث میبرن و هر کدوم ویژگیهای خاص خودشون (مثل نمره برای دانشجو یا حقوق برای کارمند) رو اضافه میکنن. اینجوری بدون اینکه کد تکراری بنویسیم، همه رو با یه ساختار منظم مدیریت میکنیم.
3 . چندریختی (Polymorphism): فرض کنید میخواهیم یه کار عجیب بکنیم: یه تابع بنویسیم که بتونه برای هر نوع موجود (دانشجو، استاد، کارمند) یه پیام خاص چاپ کنه، بدون اینکه برای هر کدوم یه تابع جدا بنویسیم. اینجا چندریختی به کمکمون میاد. با تعریف یه متد مجازی (virtual) تو کلاس Person مثل PrintRole() و اورراید کردنش تو کلاسهای فرزند، هر شیء خودش تصمیم میگیره چه پیامی نشون بده. مثلاً student.PrintRole() میگه "من دانشجوام" و professor.PrintRole() میگه "من استادیارم". این انعطافپذیری واقعاً شگفتانگیزه!
4 . انتزاع (Abstraction): اگه بخواهیم پیچیدگیها رو کم کنیم و فقط چیزای مهم رو نشون بدیم، از انتزاع استفاده میکنیم. مثلاً فرض کنید میخواهیم یه سیستم پرداخت آنلاین بسازیم که هم با کارت بانکی کار کنه هم با کیف پول دیجیتال. یه کلاس انتزاعی یا اینترفیس به اسم IPayment تعریف میکنیم که فقط متد Pay() رو مشخص میکنه. حالا هر نوع پرداخت (مثل CreditCardPayment یا DigitalWalletPayment) خودش جزئیاتش رو پیادهسازی میکنه، و ما فقط با Pay() کارمون رو پیش میبریم بدون اینکه درگیر پیچیدگیها بشیم.
6 - 5 . کلاسها و اشیا (Classes and Objects): پایه همه این کارها کلاسها و اشیائند. مثلاً میخواهیم یه بازی بسازیم که توش شخصیتها، سلاحها و دشمنها باشن. برای هر کدوم یه کلاس تعریف میکنیم (مثل Player، Weapon، Enemy) و با ساختن اشیا از این کلاسها، دنیای بازیمون رو زنده میکنیم. هر شیء میتونه ویژگیها و رفتارهای خاص خودش رو داشته باشه، مثلاً یه بازیکن با قدرت 50 و یه سلاح با Damage 20.
7 . پیامرسانی (Messaging): این مفهوم وقتی به کار میاد که بخواهیم اشیا با هم حرف بزنن. مثلاً تو همون بازی، اگه بازیکن به دشمن حمله کنه، شیء Player یه پیام (فراخوانی متد) به شیء Enemy میفرسته که مثلاً TakeDamage(20) رو اجرا کنه. اینجوری اشیا با هم تعامل میکنن و کارای پیچیده مثل نبرد رو ممکن میکنن.
8 . ارتباط و وابستگی (Association/Dependency): اگه بخواهیم یه سیستم بزرگتر بسازیم که بخشهاش به هم وصل باشن، از این مفهوم استفاده میکنیم. مثلاً تو یه برنامه فروشگاهی، کلاس Order به کلاس Customer وابستهست چون هر سفارش مال یه مشتریه. یا تو بازی، Player به Weapon وابستهست چون بازیکن بدون سلاح نمیتونه حمله کنه. این ارتباطها باعث میشه سیستم ما مثل یه پازل کامل کار کنه.
9 . اینترفیس (Interface): اگه بخواهیم یه کار بهظاهر غیرممکن مثل وصل کردن بخشهای مختلف برنامه رو بدون اینکه به جزئیاتشون گیر کنیم انجام بدیم، از اینترفیس استفاده میکنیم. فرض کنید میخواهیم یه سیستم پخش موسیقی بسازیم که هم با بلندگوهای بلوتوثی کار کنه، هم با هدفون سیمی، هم با یه دستگاه پخش ماشین. یه اینترفیس به اسم IPlayable تعریف میکنیم که فقط متد Play() رو مشخص کنه. حالا هر دستگاه (مثل BluetoothSpeaker یا WiredHeadphones) این اینترفیس رو پیادهسازی میکنه و خودش تصمیم میگیره چطور صدا رو پخش کنه. اینجوری کد ما انعطافپذیر میشه و میتونیم بدون تغییر برنامه اصلی، دستگاههای جدید رو بهش اضافه کنیم. این قدرت انتزاع و استانداردسازی واقعاً ذهن آدم رو درگیر میکنه که چطور یه ایده ساده این همه کار رو ساده میکنه!
10 . سطوح دسترسی (Access Modifiers): حالا اگه بخواهیم یه سیستم امن و منظم بسازیم که هرکسی نتونه به هر بخشش دست بزنه، از سطوح دسترسی مثل public، private، protected و internal استفاده میکنیم. مثلاً تو یه برنامه بانکی، میخواهیم موجودی حساب مشتری فقط از طریق یه متد خاص (مثل برداشت یا واریز) تغییر کنه و کسی مستقیم بهش دسترسی نداشته باشه. با تعریف فیلد private decimal balance و یه متد عمومی مثل public void Withdraw(decimal amount) که شرطهای لازم (مثل کافی بودن موجودی) رو چک کنه، این کار رو ممکن میکنیم. یا مثلاً تو یه پروژه تیمی، با internal یه کلاس رو فقط برای همون اسمبلی نگه میداریم تا بقیه پروژهها بهش دست نزنن. این کنترل دسترسی باعث میشه کد ما هم قابلاعتمادتر بشه، هم ساختارش شفافتر بمونه.
با این مفاهیم، شما میتونید کارهایی بکنید که شاید اولش غیرممکن به نظر بیاد. مثلاً یه برنامه بسازید که خودش تصمیم بگیره کی تخفیف بده، یا یه رابط کاربری که با یه کلیک کلی کار انجام بده. C# و شیگرایی بهتون این قدرت رو میدن که ایدههاتون رو به شکلی منظم و قابلمدیریت به کد تبدیل کنید. هر کدوم از این مفاهیم مثل یه ابزار توی جعبهابزار شماست که بسته به نیازتون میتونید ازش استفاده کنید تا دنیای دیجیتال رو اونجوری که میخواهید بسازید!