برنامه نویسی شیء گرا در سی شارپ
برنامه نویسی شیء گرا چیست؟
برنامه نویسی شیء گرا نگرشی خاص به روش پیاده سازی راهکار های برنامه نویسی است. برنامه نویسی شیء گرا به شما اجازه میدهد راهکار خود را بهتر، موثر تر و راحت تر پیاده سازی نمایید. همچنین در آینده، نگهداری و بهینه سازی کد آسان تر خواهد بود. استفاده از برنامه نویسی شیء گرا، از تکرار کدهای مشابه جلوگیری خواهید کرد. بکار گیری این روش موجب افزایش سرعت توسعه برنامه خواهد شد. سهولت در اصلاح امکانات های موجود و یا افزودن امکانات جدید به ساختارهای فعلی از دیگر مزایای این سبک برنامه نویسی است.
در برنامه نویسی شیء گرا، شما فورا به پیاده سازی ابزار یا محصول مورد نظر نخواهید پرداخت. بلکه ابتدا به ویژگی ها، عملکرد ها و وقایع ساختار مورد نظرتان فکر خواهید کرد. سپس الگو یا قالبی که توصیف کننده ساختار نهایی باشد را پیاده سازی میکنید. به این قالب یا الگو، Class میگویند. (برای آشنایی بیستر با Class ها مطلب: Class ها در سی شارپ را مطالعه نمایید).
Class به عنوان نقشه ای برای ساختن محصول یا شیء نهایی بکار میرود. از این رو باید تمام خصایص، عملکرد ها و رخدادهای آن را توصیف نماید. این موارد از طریق Member ها توصیف میشوند. (برای آشنایی بیشتر با Member ها مطلب: Member ها در سی شارپ را مطالعه نمایید).
Instance یا نمونه چیست؟
وقتی یک کلاس طراحی و پیاده سازی شد شما میتوانید نمونه هایی از روی آن بوجود آورید. این نمونه ها اشیاء قابل استفاده ای هستند. ما از ابتدا به وجود این اشیاء نیاز داشتیم. یک برنامه را در نظر بگیرید که قرار است در آن اطلاعات اتومبیل ها نگهداری شود. بنابر این نیاز به تعداد زیاد و نامشخصی ساختار مشابه داریم. هریک از این ساختار ها باید بتوانند یک اتومبیل خاص را توصیف کنند. یه همین منظور یک کلاس به نام Car برای نگهداری اطلاعات انواع اتومیبل ها طراحی میکنیم.
این کلاس شامل خصوصیاتی مانند:
- مدل
- قدرت موتور
- رنگ
- سال ساخت
- قیمت
- شماره پلاک
- و …
خواهد بود.
همچنین رخداد هایی مانند:
- فروخته شد
- دچار اشکال شد
- و ..
میتواند در این کلاس وجود داشته باشد. هر بار از روی این کلاس نمونه ای ساخته شود، تمام خصوصیات فوق در شیء جدید قرار خواهد گرفت. مقادیر و وضعیت این شیء مستقل از سایر اشیاء می باشد. به همین دلیل میتوان تعداد بی شمار نمونه مستقل ساخت. اگر به اجزاء بازی های کامپیوتری فکر میکنید، دقیقا به مثالی درست رسیده اید. به دنیای نرم افزار های اطرافتان نگاه کنید. همه جا این الگو را به سادگی خواهید دید.
مفاهیم اساسی برنامه نویسی شیء گرا
برنامه نویسی شیء گرا امکانات و قابلیت هایی در اختیار برنامه نویس قرار میدهد. این قابلیت ها به سرعت توسعه کد و سهولت نگهداری آن منجر خواهند شد. این قابلیت عبارتند از:
با استفاده از این قابلیت ها، می توانید راهکار های خود را بهینه تر پیاده سازی نمایید. در ادامه به معرفی و بررسی هر یک از این موارد خواهیم پرداخت.
مفهوم Encapsulation در برنامه نویسی شیء گرا
Encapsulation به معنای قراردادن Memberها در یک بسته می باشد. این بسته در واقع با استفاده از همان ساختار Class بوجود میآید. بنابراین هر نمونه ساخته شده از روی کلاس، یک شیء مستقل و کامل خواهد بود. Encapsulation به مخفی کردن داده ها منجر می شود. Data Hiding موجب می شود خصوصیات و عملکرد های داخلی Object از دنیای بیرون آن مخفی بماند. به همین دلیل ساختار Object ساده تر به نظر خواهد آمد. در عین حال روش انجام عملکردها و اطلاعات داخلی، در دسترس سایر اشیاء نخواهد بود. برای رسیدن به این منظور از Access Modifier ها استفاده میشود. (برای آشنایی بیشتر با Access Modifier ها و سطوح دسترسی مطلب: Access Modifier ها در سی شارپ را مطالعه نمایید).
تصور کنید بورد الکترونیکی، اتصالات و سایر اجزاء یک ماشین حساب بدون قاب در اختیارتان بود. امکان استفاده صحیح از آن تقریبا به صفر میرسید. همچنین احتمال آسیب زدن به ساختارش چه عمدی، چه سهوی بسیار بالا بود. این در حالی است که شما تنها به تعدادی دکمه و یک صفحه نمایش برای کار با آن نیاز داشتید. با استفاده از Encapsulation یک قاب، امکانات داخلی را مخفی میکند. در حالی که بخشی از امکانات از خارج از آن قاب، در دسترس عموم خواهد بود. به این بخش از امکانات عمومی Public Interface گفته میشود.
با استفاده از Interface ها می توانید، ساختاری کلی برای Public Interface تعریف نمایید. (برای آشنایی بیشتر با interface ها مطلب: Interface ها در سی شارپ را مطالعه نمایید). پس از آن کلاس ها Interface مورد نظر را به سبک خودشان پیاده سازی می کنند. بنابراین کلاس ها دارای ظاهری همشکل و عملکردهای متفاوتی خواهند بود.
Interface ها یکی از ابزار های کاربردی در بحث طراحی و برنامه نوبسی سرویس ها میباشند.
مفهوم Inheritance در برنامه نویسی شیء گرا
Inheritance یا وراثت از کاربردی ترین قابلیت های برنامه نویسی شیء گراست. عملا Inheritance به شما امکان بوجود آوردن Class های جدید، بر اساس Class های موجود را خواهد داد. در این حالت، کلاس جدید را از یکی از کلاس های موجود مشتق میکنید. سپس بدون حتی نوشتن یک دستور، تمام امکانات کلاس قبلی را در اختیار خواهید داشت. بر همین اساس با افزودن Member هایی به کلاس جدید، امکانات کلاس قبلی توسعه خواهد یافت. همین روال موجب تغییر ساختار و تکامل دستورات کلاس میشود. بدین روش ساختاری سلسله مراتبی از کلاس ها بوجود میآید. در راس کلاس والد یا Parent وجود دارد. خصوصیات این کلاس توسط یک یا چند کلاس به ارث برده شده است. به این کلاس ها فرزند یا Child گفته میشود.
از دیدگاه Inheritance کلاس ها در سه دسته می توانند طبقه بندی شوند:
- Abstract Class
کلاس هایی بدون امکانات کامل برای استفاده می باشند. ممکن است امکانات این کلاس ها فقط عنوان شده باشند. این امکانات تا پیاده سازی نشوند، قابل استفاده نخواهند بود. به این گونه امکانات Abstract Member گفته میشود. ممکن است تمام امکانات لازم برای قابل استفاده بودن شی نهایی در این کلاس ها موجود نباشد. ویژگی های Abstract Class ها شامل این موارد میشوند:- از روی این کلاس ها نمیتوان نمونه سازی کرد.
- این کلاس ها باید حتما به عنوان Parent استفاده شوند.
- abstract member ها تنها در abstract class ها قابل نوشتن هستند.
- Normal Class
این کلاس ها، می توانند نقش Parent را داشته باشند. همچنین ممکن است خوصوصیاتی به ارث برده و Child یک کلاس دیگر باشند. از روی این کلاسها میتوان نمونه سازی کرد. - Sealed Class
این کلاس ها نقطه پایانی در درخت وراثت هستند. اینگونه کلاس ها نمیتوانند Parent کلاس دیگری باشند. بنابراین خصوصیاتشان جایی به ارث نخواهد رفت. این کلاس ها میتوانند Child یک کلاس دیگر باشند. این کلاس ها مانند کلاس های عادی، قابلیت نمونه سازی را دارا می باشند.
Virtual Member ها و مفهوم Override
برای بازنویسی و تعریف Abstract Member ها می توان از کلمه کلیدی override استفاده نمود. همچنین در بحث وراست امکان تعریف virtual member ها وجود داد. Virtual Member یک Member است که قابلیت بازنویسی شدن در کلاس Child برای آن وجود داد. در این صورت نوع Child این اختیار را دارد که از پیاده سازی Member در کلاس Parent استفاده نماید یا به دلخواه خود برای Member مورد نظز یک روش پیاده سازی جدید به سبک خود داشته باشد.
** دقت داشته باشید، هر کلاس می تواند نهایتا یک Parent مستقیم داشته باشد. ولی در ساختار درخت وراثت یک Class میتواند خصوصیات چندین Class دیگر را در رده های مختلف به ارث برده باشد.
مفهوم Polymorphism در برنامه نویسی شیء گرا
Polymorphism به معنای چند شکلی بودن است. در برنامه نویسی شیء گرا، این بدان معناست که:
- زمان Runtime نمونه های کلاس Child مانند نمونه های Parent در نظر گرفته شوند. این اتفاق در پارامتر های ورودی توابع، آرایه ها و Collection ها میتواند کاربرد داشته باشد.
- کلاس Parent می تواند Virtual Member هایی تعریف کند و کلاس Child قادر به Override کردن آنها خواهد بود. در این صورت کلاس Child روش اختصاصی خود را برای Member مورد نظر پیاده سازی خواهد کرد.
Polymorphism این امکان را فراهم می کند که یک شیء بتواند به شکل های مختلف استفاده شود. همچنین میتوان Polymorphism را به دو دسته زیر تقسیم کرد:
- Static Polymorphism:
به آن روش Compile Time Polymorphism یا Early Binding نیز گفته میشود. در این روش، کامپایلر تصمیم می گیرد کدام نسخه از Member که چند شکلی است، فراخوانی شود. به عنوان مثال می توان به Overloading اشاره کرد. وقتی یک تابع را Overload می کنیم، نام آن ثابت و Signature آن تغییر میکند. در این حالت Compiler با توجه به نوع و تعداد آرگومان ها حین فراخوانی، مشخص میکند کدام Overload باید اجرا شود.
- Dynamic Polymorphism:
به آن روش Runtime Polymorphism یا Late Binding نیز گفته میشود. در این روش، یک Member با نام و ساختار کلی یکسان در کلاس های Parent و Child وجود دارد. عملا Child آن Member را از Parent به ارث برده و Override کرده است. در این صورت، Member مورد نظر برای فراخوانی و استفاده حین Compile مشخص نمیشود. بلکه در زمان Runtime با توجه به ساختار وراثت و Override شدن یا نشدن Member، تشخیص داده خواهد شد که Member مورد نظر از کجا احرا شود. Virtual Member ها نمونه ای از مواردی است که میتوان Dynamic Polymorphism را پیاده سازی کرد.
بسیار روان و کامل و آموزنده بود. آموزش شی گرایی در سطح نت به این تمیزی ندیدم. خیلی سپاسگذارم
ممنون از نظرتون
خوشحالیم مفید بوده