برنامه نویسی شی گرا برای چندین دهه یکی از اصلیترین الگوهای برنامه نویسی بوده است. مفهوم شی گرایی در دنیای توسعه نرمافزار انقلابی در طراحی، توسعه و نگهداری برنامهها ایجاد کرد. در این بین زبان محبوب سی شارپ از این تکنیک برنامه نویسی پشتیبانی میکند. شی گرایی با سازماندهی کد به موجودیتهای با قابلیت استفاده مجدد به نام اشیا فرایند توسعه را تسهیل میکند. توسعه دهندگان با استفاده از شی گرایی در سی شارپ میتوانند برنامههایی کاربردی در مقیاس بزرگ را توسعه دهند. در این مطلب از مجله فرادرس به اصول شی گرایی در سی شارپ و اصلیترین مفاهیم این زبان پرداخته شده است.
با مطالعه این مطلب مفاهیم اساسی شی گرایی نظیر کلاسها، اشیا، وراثت، چندریختی، انتزاع، کپسوله سازی و بسیاری موارد دیگر را در قالب مثالهای عملی خواهید آموخت. در این نوشته برای درک بهتر مفاهیم شی گرایی نمونههای عملی و مثالهایی از دنیای واقعی نیز ارائه شده است. در نهایت، مطالعه کامل این مطلب میتواند درک جامعی از شی گرایی و مباحث مرتبط با آن برای شما ایجاد کند.
منظور از شی گرایی در سی شارپ چیست؟
«برنامه نویسی شی گرا» (Object-Oriented Programming | OOP) یک الگوی برنامه نویسی است که هدف اصلی آن نزدیک ساختن دنیای برنامه نویسی به عناصر موجود در دنیای واقعی است. این سبک برنامه نویسی برای طراحی و توسعه اپلیکیشنهای کاربردی از دو مفهوم اصلی شی و کلاس استفاده میکند.
در برنامه نویسی شی گرا موجودیتهای برنامه در قالب شی در نظر گرفته میشوند که برای این اشیا امکان تعریف ویژگیها و رفتارهای منحصر به فرد وجود دارد. هر شی در برنامه دارای خصوصیت و رفتاری مستقل از سایر اشیا است و امکان تعامل با اشیا دیگر برنامه را دارد. به طور خلاصه شی گرایی یک روش جدید برای حل مسئله معرفی میکند و مستقل از زبان برنامه نویسی است. با این حال در این نوشته شی گرایی در سی شارپ را مورد بررسی قرار خواهیم داد. در نخستین گام به سراغ دو مفهوم اصلی این حوزه یعنی شی و کلاس خواهیم رفت.
شی در برنامه نویسی شی گرا چیست؟
«شی» (Object) اولین و ابتداییترین موجودیت در برنامه نویسی شی گرا است که توسعه دهنده از آن به منظور طراحی و پیادهسازی برنامه خود استفاده میکند. هر شی یک نمونه از کلاس است که ویژگیها و رفتارهای مخصوص به خود را دارد. با مطالعه مطلب شی در برنامه نویسی مجله فرادرس میتوانید اطلاعات بیشتری در خصوص این مفهوم بنیادی به دست آورید.
کلاس در برنامه نویسی شی گرا چیست؟
«کلاس» (Class) را میتوان مهمترین مفهوم در برنامه نویسی شی گرا دانست. در واقع، بدون وجود کلاس هیچ شی در برنامه نخواهیم داشت. به زبان سادهتر یک کلاس طرح اولیه یا یک الگو است که ساختار و رفتار اشیا را مشخص میکند. کلاس را میتوان همانند نقشهای برای ساخت شی در نظر گرفت که بر اساس آن میتوان تعداد بسیار زیادی شی ساخت. در واقع، کلاس نیز همانند نقشه ساخت خانه است که بر اساس آن چندین خانه میتوان ساخت. پیشتر در مطلب زیر از مجله فرادرس مفهوم کلاس در برنامه نویسی همراه با مثال عملی مورد بررسی قرار گرفته است.
مثالی از مفهوم شی و کلاس در برنامه نویسی
برای درک بهتر تفاوت دو مفهوم شی و کلاس در برنامه نویسی به مثال زیر توجه کنید. کلاسی با نام Car
را در نظر بگیرید. از این کلاس برای ساخت شی ماشین استفاده میشود. در این کلاس ویژگیهایی همچون رنگ، مدل و سال تولید به عنوان مشخصههای یک ماشین تعیین شده است. حالا با استفاده از این کلاس و تعیین ویژگیهای مورد نیاز میتوان یک ماشین جدید ایجاد کرد. همچنین، در صورت نیاز میتوان ماشینهای دیگری با مشخصات متفاوت از این کلاس ساخت.
به طور خلاصه، یک کلاس خصوصیات و رفتار کلی گروهی از اشیا مشابه را تعریف میکند. در حالی که یک شی نمونه خاصی از آن کلاس است که ویژگیها و رفتار منحصر به فرد خود را دارد.
تعریف کلاس در سی شارپ
کلاس را میتوان هسته اصلی شی گرایی در سی شارپ دانست. یک کلاس طرح و نقشه ساخت شی را مشخص میکند. توسعه دهندگان با استفاده از کلاس میتوانند نوع داده سفارشی و مدنظر خود را تعریف کنند. ویژگیها و رفتار شی را میتوان به کمک کلاس مشخص کرد. در ادامه اصلیترین مفاهیم در تعریف کلاس همچون فیلدها، متد و تابع سازنده را مورد بررسی قرار خواهیم داد.
فیلد های کلاس
فیلدهای یک کلاس در سی شارپ متغیرهایی هستند که دادههای مربوط به یک شی از کلاس را ذخیره میکنند. در واقع، فیلدهای کلاس نشان دهنده صفات یا ویژگیهای یک شی هستند. فیلدهای کلاس را میتوان با سطوح دسترسی مختلف همچون عمومی، خصوصی، محافظت شده و سایر موارد تعریف کرد. به عنوان مثال، کلاسی که یک خودرو را نشان میدهد میتواند فیلدهایی همچون سال تولید، رنگ، مدل، حداکثر سرعت، شتاب و سایر موارد را داشته باشد. امکان دسترسی، مقداردهی و اصلاح فیلدهای کلاس با استفاده از متدهای داخل کلاس وجود دارد.
متد های کلاس
متدهای کلاس در سی شارپ نشان دهنده رفتار یا اعمالی هستند که اشیا یک کلاس میتوانند انجام دهند. در واقع، متدهای یک کلاس رفتار و عملکرد شی را مشخص میکنند. متدها به صورت توابع مختلف در کلاس تعریف میشوند. به عنوان مثال، کلاسی که یک خودرو را نشان میدهد میتواند متدهایی همچون حرکت کردن، ترمز گرفتن، روشن شدن و سایر موارد را داشته باشد. با استفاده از متدها میتوان به فیلدهای کلاس دسترسی داشت و عملیات مختلف را بر روی آنها انجام داد. به طور خلاصه، فیلدهای کلاس وضعیت یا دادههای شی و متدهای کلاس رفتار یا اقدامات قابل انجام بر روی شی را تعریف میکنند.
تابع سازنده کلاس
در زبان سی شارپ تابع سازنده کلاس یک متد خاص است که تنها در زمان ایجاد شی از کلاس فراخوانی میشود. این تابع مسئولیت مقداردهی اولیه به شی ساخته شده از کلاس را برعهده دارد. تابع سازنده همنام کلاس است و مقدار بازگشتی نیز ندارد. قطعه کد زیر تابع سازنده کلاس در سی شارپ را نشان میدهد.
1public class MyClass
2{
3 private int myField;
4
5 // Constructor
6 public MyClass()
7 {
8 myField = 0; // Set initial value for the field
9 }
10}
در مثال بالا تابع سازنده MyClass()
همنام با کلاس تعریف شده است و فیلد myField
از کلاس را مقداردهی میکند. با ایجاد شی از کلاس این تابع به صورت خودکار فراخوانی میشود.
مثالی از ساخت کلاس در سی شارپ
برای درک بهتر مفاهیم ذکر شده در بخش قبلی همچون فیلدها، متدها، تابع سازنده کلاس و نحوه تعریف آنها مثال زیر آورده شده است.
1class customer
2 {
3 // Member Variables
4 public int CustID;
5 public string Name;
6 public string Address;
7
8 //constuctor for initializing fields
9 customer()
10 {
11 CustID=1101;
12 Name="Tom";
13 Address="USA";
14 }
15
16 //method for displaying customer records (functionality)
17 public void displayData()
18 {
19 Console.WriteLine("Customer="+CustID);
20 Console.WriteLine("Name="+Name);
21 Console.WriteLine("Address="+Address);
22 }
23 // Code for entry point
24 }
در قطعه کد بالا کلاس customer
با استفاده از کلمه کلیدی class تعریف شده است. این کلاس دارای ۳ فیلد با نامهای CustID
، Name
و Address
دارد که توسط تابع سازنده کلاس مقداردهی اولیه میشوند. همچنین، متد displayData()
در صورت اجرا اطلاعات مربوط به شی را در خروجی چاپ میکند. در ادامه قطعه کد زیر نحوه ساخت شی از این کلاس و فراخوانی متد مربوط به آن را نشان میدهد.
1// object instantiation
2 customer obj = new customer();
3
4//Method calling
5 obj.displayData();
در قطعه کد بالا یک شی با نام obj
از کلاس customer
ساخته شده است. با فراخوانی متد displayData()
خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
Customer = 1101 Name = Tom Address = USA
اطلاعات مربوط به شی در خروجی چاپ شده است.
چرا باید از برنامه نویسی شی گرا استفاده کنیم؟
برنامه نویسی شی گرا یک الگوی برنامه نویسی است که با استفاده از اشیا مختلف طراحی و توسعه نرمافزار را سازماندهی میکند. استفاده از شی گرایی در سی شارپ چندین مزیت را همراه دارد و به همین دلیل به طور گسترده مورد استفاده قرار میگیرد. در ادامه مهمترین دلایل برای استفاده از شی گرایی در سی شارپ آورده شده است.
- ماژولار بودن
- قابلیت استفاده مجدد
- انعطاف پذیری
- مقیاس پذیری
در ادامه این بخش هر کدام از دلایل ارائه شده در بالا به طور کامل توضیح داده شده است.
ماژولار بودن
شی گرایی با فراهم آوردن امکانی برای تجزیه برنامه به بخشهای کوچکتر و قابل مدیریتتر ماژولار بودن کد را بهبود میبخشد. با تقسیم شدن برنامه به بخشهای کوچکتر و مستقل، توسعه و بروزرسانی آن نیز آسانتر میشود.
قابلیت استفاده مجدد
شی گرایی در سی شارپ به توسعه دهندگان امکان میدهد تا اشیا جدید را بر مبنای اشیا موجود در برنامه پیادهسازی کنند. در نتیجه این امر سبب میشود تا از کدهای موجود در برنامه مجدداً استفاده شود. این مورد سبب صرفهجویی در زمان و هزینه توسعه برنامههای جدید میشود.
انعطاف پذیری
استفاده از شی گرایی در برنامه نویسی انعطاف پذیری در طراحی و پیادهسازی سیستمهای نرمافزاری را بهبود میبخشد. بنابراین، توسعه دهندگان به سادگی میتوانند عملکرد اشیا موجود در برنامه را بدون تاثیر بر سایر بخشهای برنامه تغییر و گسترش دهند.
مقیاس پذیری
یکی از مهمترین دلایل استفاده از شی گرایی در سی شارپ بهبود مقیاس پذیری برنامه است. این بدان معنی است که با رشد و گسترش برنامه به سادگی میتوان کلاسها و اشیا جدید را به برنامه اضافه کرد. در نتیجه، انجام تغییرات و بروزرسانی در نرمافزار آسانتر میشود.
یادگیری شی گرایی در سی شارپ با فرادرس
یادگیری برنامه نویسی شی گرا در سی شارپ مهارت بسیار ارزشمندی است. امروزه هر توسعه دهندهای باید بتواند از این تکنیک برنامه نویسی در طراحی و توسعه برنامههای خود استفاده کند. برای یادگیری شی گرایی در سی شارپ باید در گام نخست مفاهیم اولیه مربوط به آن نظیر کلاسها، اشیا و اصول شی گرایی همچون وراثت، چندریختی، کپسوله سازی و سایر موارد را به خوبی درک کنید. در گام بعدی باید به سراغ منابع آموزشی مختلف بروید که در این بین ویدیوهای آموزشی گزینه بسیار خوبی محسوب میشوند. در پلتفرم فرادرس به عنوان بزرگترین مرجع آموزشی کشور ویدیوهای آموزشی متعددی در حوزه شی گرایی و زبان برنامه نویسی سی شارپ منتشر شده است.
برای شروع میتوانید فیلم آموزشی شی گرایی در سی شارپ فرادرس که لینک آن در ادامه آورده شده است را مشاهده کنید.
در این آموزش مفاهیم اولیه شی گرایی و اصول ابتدایی آن به طور کامل بیان شده است. همچنین، مباحث مهمی همچون وراثت، چندریختی، کپسوله سازی و سایر موارد در قالب مثال عملی همچون سیستم حقوق و دستمزد کارکنان، سیستم اطلاعرسانی و سایر موارد در این آموزش پیادهسازی شدهاند.
اصول شی گرایی در سی شارپ چیست؟
برنامه نویسی شی گرا در سی شارپ مبتنی بر چند اصل مهم است که به طراحی و پیادهسازی راهحلهای نرمافزاری کمک میکند.
این اصول تحت عنوان ۴ اصل شی گرایی شناخته میشوند که سنگ بنای ایجاد کدهای ماژولار، قابل استفاده مجدد و مقیاس پذیر در سی شارپ را فراهم میکنند. ۴ اصل برنامه نویسی شی گرا عبارتنداز:
۴ اصل ارائه شده در بالا ستونهای اصلی برنامه نویسی شی گرا را تشکیل میدهند و درک این اصول پیش از کار با زبانهای برنامه نویسی شی گرا نظیر سی شارپ ضروری است. در ادامه نوشته سعی شده است تا هر کدام از این اصول به طور کامل همراه با مثال توضیح داده شوند. پیشتر نیز در مطلب زیر از مجله فرادرس اصول برنامه نویسی شی گرا به زبان ساده بیان شده است.
وراثت در سی شارپ
وراثت یکی از مفاهیم مهم و پرکاربرد در بیشتر زبانهای برنامه نویسی است و هنگام کار با زبانهای برنامه نویسی شی گرا حتماً با این مفهوم سروکار خواهید داشت. زبانهای برنامه نویسی شی گرا همچون جاوا و سی شارپ از وراثت پشتیبانی میکنند. در ادامه این بخش به بررسی مفهوم وراثت و نحوه استفاده از آن در سی شارپ خواهیم پرداخت. برای درک بهتر مفهوم وراثت در سی شارپ میتوانید فیلم آموزش وراثت در شی گرایی سی شارپ فرادرس که لینک آن در ادامه آورده شده است را مشاهده کنید.
مفهوم وراثت در سی شارپ چیست؟
برای درک بهتر وراثت، این مفهوم را در قالب یک مثال مورد بررسی قرار خواهیم داد. یک شجره نامه خانوادگی را در نظر بگیرید که در آن هر نسل نشان دهنده یک کلاس در سی شارپ باشد. در این شجره نامه نسل اول کلاس پایه است که ساختار و ویژگیهای اساسی را تعیین میکند. به نوعی کلاس پایه را میتوان به بزرگ خاندان تشبیه کرد که ارزشها و ویژگیهای اصلی خانواده را مشخص میکند. با ادامه بررسی شجره نامه خانوادگی مشاهده میشود که نسلهای بعدی صفات و ویژگیهای نسل قبلی را به ارث میبرند و با حذف یا اضافه کردن چند ویژگی جدید هویت منحصر به فرد خود را ایجاد میکنند.
به عنوان مثال، بزرگ خاندان ممکن است به کار باغبانی علاقهمند باشد که این مورد به یک ویژگی اساسی تبدیل شده و از طریق نسلهای بعدی منتقل میشود. با این وجود با تکامل شجره نامه خانوادگی برخی از اعضای خانواده ممکن است به رشد گیاهان خاص علاقهمند شوند و برخی دیگر به باغبانی ارگانیک علاقه نشان دهند. این علایق متنوع نشان دهنده ویژگیهای منحصر به فرد هر کدام از نسلهای بعدی هستند که علاقه اولیه نسبت به باغبانی را از کلاس پایه به ارث بردهاند، اما هر کدام ویژگیهای منحصر به فرد خود را نیز دارا هستند.
شباهت وراثت در شی گرایی با شجره نامه خانوادگی
در مثال بالا بزرگ خاندان نشان دهنده کلاس پایه است که ویژگیهای اساسی را مشخص میکند. سایر کلاسهای مشتق شده نیز نسلهای بعدی هستند که هر کدام در عین ارثبری ویژگیهای اصلی از کلاس پایه، ویژگیهای منحصر به فرد خود را نیز دارا هستند. این فرایند وراثت امکان ایجاد یک شجره نامه خانوادگی غنی و متنوع را فراهم میکند که در آن هر نسل بر پایه نسل قبلی بنا شده و صفات جدیدی را اضافه کرده و ویژگیهای موجود را اصلاح میکند.
سینتکس وراثت در سی شارپ
در واقع، وراثت مکانیزمی است که به توسعه دهندگان امکان میدهد تا کلاس جدیدی را بر مبنای کلاس موجود تعریف کنند. کلاسهای جدید تعریف شده تمام اعضای کلاس موجود شامل فیلدها، خصوصیتها و متدهای آن را به ارث میبرند. در این تعریف کلاس موجود به عنوان کلاس پایه و کلاس جدید ساخته شده از آن به عنوان کلاس مشتق شده شناخته میشود. سینتکس وراثت در سی شارپ در ادامه آورده شده است.
1class BaseClass
2{
3 // Base class members
4}
5
6class DerivedClass : BaseClass
7{
8 // Derived class members
9}
در قطعه کد ارائه شده در بالا کلاس DerivedClass
از کلاس پایه BaseClass
مشتق شده است. کلاس DerivedClass
تمام اعضا و متدهای موجود در کلاس BaseClass
را به ارث میبرد. علامت :
نشان دهنده مشتق شدن کلاس DerivedClass
است.
مثالی از ارث بری کلاس ها در سی شارپ
همان طور که پیشتر نیز عنوان شد، کلاس طرح اولیه برای ساخت شی را مشخص میکند. یک کلاس خصوصیات و متدهای یک شی را تعیین میکند. مثال زیر تعریف کلاس در سی شارپ را نشان میدهد.
1class Person
2{
3 public string Name { get; set; }
4 public int Age { get; set; }
5
6 public void Display()
7 {
8 Console.WriteLine($"Name: {Name}, Age: {Age}");
9 }
10}
در قطعه کد ارائه شده در بالا کلاس Person
دارای ۲ مشخصه با نامهای Name
و Age
و یک متد با نام Display
است. مشخصهها نشان دهنده وضعیت شی و متدها نشان دهنده رفتار شی هستند. یک شی از کلاس Person
با مشخصات زیر ایجاد شده است.
1Person person = new Person();
2person.Name = "John";
3person.Age = 30;
با فراخوانی متد Display
مربوط به این شی مشخصات مربوط به آن در خروجی نمایش داده خواهد شد.
خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
Name: John, Age: 30
بررسی چند اصطلاح در وراثت
در زمان ارثبری کلاسها با چند اصطلاح و مفهوم کلیدی نظیر کلاس پایه، کلاس انتزاعی، کلاس مشتق و کلاس فرزند سروکار خواهید داشت که در ادامه هر کدام از این مفاهیم به طور کامل توضیح داده شدهاند.
منظور از کلاس پایه در وراثت چیست؟
کلاس پایه در وراثت به کلاسی گفته میشود که اعضای آن توسط سایر کلاسها ارثبری میشوند. این کلاس تحت عنوان کلاس والد نیز شناخته میشود. قطعه کد زیر یک کلاس پایه را نشان میدهد.
1public class BaseClass
2{
3 public void Display()
4 {
5 Console.WriteLine("This is a base class");
6 }
7}
کلاس BaseClass
در صورت ارثبری سایر کلاسها از آن به عنوان کلاس پایه یا والد شناخته میشود.
منظور از کلاس مشتق در وراثت چیست؟
کلاس مشتق کلاسی است که اعضای کلاس پایه را به ارث میبرد. این کلاس تحت عنوان کلاس فرزند نیز شناخته میشود. قطعه کد زیر نحوه ارثبری یک کلاس فرزند از کلاس پایه را نشان میدهد.
1public class DerivedClass : BaseClass
2
3{
4 public void Show()
5 {
6 Console.WriteLine("This is a derived class");
7 }
8}
در مثال بالا کلاس DerivedClass
از کلاس پایه مشتق شده است.
منظور از کلاس انتزاعی در وراثت چیست؟
«کلاسی انتزاعی» (Abstract Class) به عنوان پایهای مشترک برای همه کلاسهای مشتق شده مورد استفاده قرار میگیرد. در واقع، شی جدیدی از کلاس انتزاعی ساخته نمیشود. این نوع کلاس در همه زبانهای برنامه نویسی شی گرا نظیر سی شارپ و جاوا مورد استفاده قرار میگیرد. قطعه کد زیر تعریف کلاس انتزاعی در سی شارپ را نشان میدهد.
1public abstract class AbstractClass
2{
3 public abstract void Display();
4}
آشنا بودن با این مفاهیم کلیدی به درک هر چه بهتر موضوع شی گرایی در سی شارپ کمک میکند. پیشتر در مطلب زیر از مجله فرادرس کلاس انتزاعی در برنامه نویسی به زبان ساده توضیح داده شده است.
در ادامه نوشته انواع وراثت در سی شارپ را مورد بررسی قرار خواهیم داد.
انواع مختلف وراثت در سی شارپ
در ادامه بررسی مبحث وراثت در سی شارپ قصد داریم تا انواع مختلف وراثت در سی شارپ را مورد بررسی قرار دهیم. وراثت در سی شارپ را بر اساس نحوه مشتق شدن و ارثبری کلاسها میتوان به انواع مختلفی طبقهبندی کرد. انواع مختلف وراثت در سی شارپ به شرح زیر هستند.
- وراثت منفرد
- وراثت چند سطحی
- وراثت سلسله مراتبی
در ادامه این بخش هر کدام از انواع وراثت ذکر شده در بالا را به همراه مثال توضیح خواهیم داد.
وراثت منفرد
وراثت منفرد سادهترین شکل وراثت است که در آن کلاس مشتق شده یا فرزند بر مبنای کلاس پایه یا والد ساخته میشود. برای درک بهتر این نوع از وراثت به مثالی از دنیای واقعی خواهیم پرداخت. شرایطی را در نظر بگیرید که تنها فرزند پدرتان هستید. بنابراین، در این شرایط ویژگیهایی از پدرتان را به ارث میبرید. این مثال شباهت بسیاری به وراثت منفرد در برنامه نویسی دارد.
قطعه کد زیر وراثت منفرد در سی شارپ را نشان میدهد.
1public class Father
2{
3 public void Display()
4 {
5 Console.WriteLine("This is the father class");
6 }
7}
8
9public class Child : Father
10{
11 public void Show()
12 {
13 Console.WriteLine("This is the child class");
14 }
15}
در مثال بالا کلاس Father
به عنوان کلاس پایه یا والد دارای متد Display
است. در ادامه کلاس Child
از این کلاس مشتق شده است. کلاس Child
متد Display
را از کلاس Father
ارثبری میکند. در ادامه یک شی از کلاس Child
ایجاد شده و متد Display
آن فراخوانی شده است.
1Child child = new Child();
2child.Display(); // Output: This is the father class
این مورد نشان میدهد که کلاس Child
امکان دسترسی به متد Display
از کلاس Father
را دارد.
وراثت چند سطحی
وراثت چند سطحی یکی از مفاهیم مهم شی گرایی در سی شارپ است که بر مبنای آن یک کلاس از کلاس مشتق شده دیگری مشتق میشود. در نتیجه، زنجیرهای از وراثت توسط آن شکل میگیرد. برای درک بهتر این نوع از وراثت شجره نامه خانوادگی خود را در نظر بگیرید. با این فرض که شما فرزند پدرتان باشید و پدرتان نیز فرزند پدربزرگ شما باشد. در این شرایط ویژگیهایی را به طور مشترک هم از پدر و هم از پدربزرگ خود به ارث خواهید برد. این مثال ارثبری چند سطحی در برنامه نویسی را نشان میدهد.
در ادامه وراثت چند سطی در سی شارپ با قطعه کد مورد بررسی قرار گرفته است.
1public class Grandfather
2{
3 public void Display()
4 {
5 Console.WriteLine("This is the grandfather class");
6 }
7}
در مثال بالا کلاس Grandfather
به عنوان کلاس پایه همراه با متد Display
آورده شده است. سپس، کلاس Father
از این کلاس مشتق شده است که کدهای مربوط به آن به صورت زیر است.
1public class Father : Grandfather
2{
3 public void Show()
4 {
5 Console.WriteLine("This is the father class");
6 }
7}
در مثال بالا کلاس Father
از کلاس Grandfather
مشتق شده است و متد Display
را از این کلاس را به ارث میبرد. در ادامه کلاس Child
ساخته شده است که از کلاس Father
ارثبری میکند.
1public class Child : Father
2{
3 public void DisplayChild()
4 {
5 Console.WriteLine("This is the child class");
6 }
7}
در قطعه کد بالا کلاس Child
از کلاس Father
مشتق شده است. این کلاس متدهای Display
و Show
را از کلاس Father
به ارث میبرد. در ادامه یک شی از کلاس Child
ساخته شده است که متدهای Display
و Show
را فراخوانی میکند.
1Child child = new Child();
2child.Display(); // Output: This is the grandfather class
3child.Show(); // Output: This is the father class
4child.DisplayChild(); // Output: This is the child class
قطعه کد بالا نشان میدهد که شی ساخته شده از کلاس Child
به متدهای Display
و Show
از کلاس Father
دسترسی دارد.
وراثت سلسله مراتبی
وراثت سلسله مراتبی یکی دیگر از مفاهیم برنامه نویسی شی گرا است که بر مبنای آن چندین کلاس میتوانند از یک کلاس پایه مشتق شوند. در نتیجه، وراثت سلسله مراتبی باعث شکلگیری ساختاری درختی میشود. برای درک بهتر این موضوع مثالی در دنیای واقعی را در نظر بگیرید. فرض کنید شما و خواهر و برادرتان از فرزندان یک پدر و مادر مشترک هستید. در نتیجه، شما و تمام اعضای خانواده ویژگیهای یکسانی را از یک والدین مشترک به ارث میبرید.
این مورد دقیقاً وراثت سلسله مراتبی در برنامه نویسی را نشان میدهد.
1public class Parent
2{
3 public void Display()
4 {
5 Console.WriteLine("This is the parent class");
6 }
7}
در مثال بالا کلاس Parent
به عنوان کلاس پایه دارای متد Display
است. سپس، دو کلاس مشتق شده تحت عنوان Child1
و Child2
از کلاس Parent
ارثبری میکنند.
1public class Child1 : Parent
2{
3 public void Show1()
4 {
5 Console.WriteLine("This is the first child class");
6 }
7}
8
9public class Child2 : Parent
10{
11 public void Show2()
12 {
13 Console.WriteLine("This is the second child class");
14 }
15}
با توجه به قطعه کد ارائه شده در بالا کلاسهای Child1
و Child2
از کلاس Parent
مشتق شدهاند. هر دو کلاس متد Display
را از کلاس Parent
ارثبری میکنند. در نتیجه، میتوان با ایجاد شی از دو کلاس Child1
و Child2
متدهای Display
، Show1
و Show2
را فراخوانی کرد.
1Child1 child1 = new Child1();
2child1.Display(); // Output: This is the parent class
3child1.Show1(); // Output: This is the first child class
4
5Child2 child2 = new Child2();
6child2.Display(); // Output: This is the parent class
7child2.Show2(); // Output: This is the second child class
مثال بالا نشان میدهد که کلاسهای Child1
و Child2
میتوانند به متد Display
از کلاس Parent
دسترسی داشته باشند. وراثت یکی از مفاهیم اصلی شی گرایی در سی شارپ است که در این بخش به طور کامل مورد بررسی قرار گرفت. در ادامه نوشته به سراغ اصل کپسولهسازی در سی شارپ خواهیم رفت.
کپسوله سازی در سی شارپ
در ادامه بررسی اصول شی گرایی در سی شارپ به بررسی مفهوم کپسولهسازی خواهیم پرداخت. قبل از بررسی مفهوم کپسوله سازی در سی شارپ نیاز است تا با مفهوم «مشخصهها» (Properties) آشنا شوید. اگر قصد یادگیری تمام اصول شی گرایی در سی شارپ را دارید پیشنهاد میشود که فیلم آموزش شی گرایی در سی شارپ فرادرس که لینک آن در ادامه آورده شده است را مشاهده کنید.
مشخصهها در سی شارپ اعضای یک کلاس هستند که سازوکاری برای خواندن، نوشتن و محاسبه یک فیلد خصوصی ارائه میکنند.
1public class Person
2{
3 private string name;
4
5 public string Name
6 {
7 get { return name; }
8 set { name = value; }
9 }
10}
در قطعه کد بالا کلاس Person
دارای یک فیلد خصوصی به نام name
و یک مشخصه با نام Name
است. مشخصه Name
یک دسترسی برای بازیابی مقدار فیلد name
و یک دسترسی برای تعیین مقدار این فیلد دارد. یادگیری مشخصهها در سی شارپ برای درک مفهوم کپسولهسازی ضروری است که در ادامه این بخش به طور کامل به بحث کپسولهسازی خواهیم پرداخت.
مفهوم کپسوله سازی در سی شارپ چیست؟
برای درک کپسوله سازی این مفهوم را در قالب یک مثال توضیح خواهیم داد. یک جعبه هدیه را در نظر بگیرید که داخل آن یک هدیه قرار دارد. در این مثال جعبه هدیه به عنوان ظرفی عمل میکند که هدیه را در خود محصور کرده است. هدیه به طور کامل از دنیای بیرون پنهان است و تنها از طریق جعبه هدیه امکان دسترسی به آن وجود دارد. این مثال بسیار نزدیک به مفهوم کپسوله سازی در برنامه نویسی شی گرا است.
در واقع، بر مبنای اصل کپسوله سازی دسترسی به اعضای یک کلاس (فیلدها و متدها) محدود میشود. کپسوله سازی دسترسی مستقیم به برخی از اجزای شی را محدود کرده و تنها از طریق متدهای کلاس اجازه دسترسی را میدهد. به زبان سادهتر کپسوله سازی در برنامه نویسی شی گرا از دسترسی به جزئیات پیادهسازی جلوگیری میکند. پیشتر در مطلب زیر از مجله فرادرس مبحث کپسوله سازی در شی گرایی به طور کامل مورد بررسی قرار گرفته است.
مثال عملی از پیادهسازی کپسوله سازی در سی شارپ
برای درک بهتر کپسوله سازی در سی شارپ این مفهوم را در قالب قطعه کد مورد بررسی قرار دادهایم.
1public class Person
2{
3 private string name;
4 private int age;
5
6 public string Name
7 {
8 get { return name; }
9 set { name = value; }
10 }
11
12 public int Age
13 {
14 get { return age; }
15 set { age = value; }
16 }
17
18 public void Display()
19 {
20 Console.WriteLine($"Name: {Name}, Age: {Age}");
21 }
22}
در مثال بالا کلاس Person
فیلدهای name
و age
و متد Display
را در قالب یک واحد کپسوله میکند. فیلدهای name
و age
از نوع «خصوصی» (private) تعریف شدهاند. در نتیجه، امکان دسترسی مستقیم به آنها خارج از کلاس وجود ندارد. مشخصههای Name
و Age
امکان دسترسی به فیلدهای خصوصی کلاس را فراهم میکنند. در ادامه مثال دیگری برای درک بهتر این مفهوم ارائه شده است.
1public class BankAccount
2{
3 private double balance;
4
5 public double Balance
6 {
7 get { return balance; }
8 private set { balance = value; }
9 }
10
11 public void Deposit(double amount)
12 {
13 if (amount > 0)
14 {
15 Balance += amount;
16 }
17 }
18
19 public void Withdraw(double amount)
20 {
21 if (amount > 0 && Balance >= amount)
22 {
23 Balance -= amount;
24 }
25 }
26
27 public void DisplayBalance()
28 {
29 Console.WriteLine($"Balance: {Balance}");
30 }
31}
در مثال بالا کلاس BankAccount
فیلد balance
و متدهای مرتبط با آن نظیر Deposit
، Withdraw
و DisplayBalance
را کپسوله میکند. فیلد balance
از نوع خصوصی تعریف شده است و تنها از طریق مشخصه Balance
میتوان به آن دسترسی داشت. این مورد از دسترسی مستقیم خارج از کلاس به فیلد balance
جلوگیری میکند و راهکاری امن برای مدیریت حساب بانکی است.
چندریختی در سی شارپ چیست؟
پلی مورفیسم یا چندریختی یکی دیگر از ستونهای اصلی شی گرایی در سی شارپ است. واژه Polymorphism از ترکیب دو کلمه یونانی «بسیاری» (poly) و «شکلها» (morphos) تشکیل میشود. در برنامه نویسی شی گرا پلی مورفیسم یا چندریختی به توانایی یک شی برای به خود گرفتن چندین شکل اشاره دارد.
برای درک بهتر مفهوم چندریختی یک پخش کننده موسیقی را در نظر بگیرید. این پخش کننده موسیقی توانایی پخش فایلهای موسیقی با فرمتهای مختلف همچون WAV، MP3 یا AAC را دارد. هر کدام از این فایلهای موسیقی با دیگری متفاوت است ولی پخش کننده موسیقی میتواند همه آنها را پخش کند. این مثال بسیار شبیه به چندریختی در برنامه نویسی شی گرا است. مطلب زیر از مجله فرادرس مفهوم پلی مورفیسم در برنامه نویسی را به زبان ساده همراه با مثال بررسی کرده است.
چندریختی در برنامه نویسی شی گرا به چه معنا است؟
چندریختی یکی از مفاهیم اصلی در برنامه نویسی شی گرا است که بر مبنای آن اشیا کلاسهای مختلف میتوانند به عنوان اشیا یک ابر کلاس مشترک در نظر گرفته شوند. در واقع، این مفهوم یک اینترفیس عمومی برای انجام دستهای از فعالیتهای مرتبط را معرفی میکند. در زبان سی شارپ دو نوع چندریختی وجود دارد که در ادامه آورده شدهاند.
- «چندریختی زمان کامپایل» (Compile-time Polymorphism)
- «چندریختی زمان اجرا» (Run-time Polymorphism)
منظور از چندریختی زمان کامپایل چیست؟
چندریختی زمان کامپایل با عنوان «سربارگذاری متد» (Method Overloading) نیز شناخته میشود. این نوع از چندریختی به یک کلاس اجازه میدهد تا چندین متد با نام یکسان و پارامترهای متفاوت داشته باشد. در این شرایط کامپایلر بر اساس تعداد و نوع آرگومانها متد مناسب را فراخوانی میکند. مثال زیر چندریختی زمان کامپایل در سی شارپ را نشان میدهد.
1public class Printer
2{
3 public void Print(string message)
4 {
5 Console.WriteLine($"Printing string: {message}");
6 }
7
8 public void Print(int number)
9 {
10 Console.WriteLine($"Printing number: {number}");
11 }
12
13 public void Print(string message, int copies)
14 {
15 for (int i = 0; i < copies; i++)
16 {
17 Console.WriteLine($"Printing string: {message}");
18 }
19 }
20}
در مثال بالا کلاس Printer
دارای ۳ متد با نام یکسان Print
است که در تعداد و نوع پارامترهای ورودی با یکدیگر متفاوت هستند. این مثال چندریختی زمان اجرا در سی شارپ را نشان میدهد.
منظور از چندریختی زمان اجرا چیست؟
چندریختی زمان اجرا با عنوان «بازنویسی متد» (Method Overriding) نیز شناخته میشود. این نوع از چندریختی به یک کلاس اجازه میدهد تا یک متد از کلاس اصلی را مجدداً به روشی دیگر بازنویسی کند. قطعه کد زیر چندریختی زمان اجرا در سی شارپ را نشان میدهد.
1public class MusicPlayer
2{
3 public virtual void Play()
4 {
5 Console.WriteLine("Playing music");
6 }
7}
8
9public class Mp3Player : MusicPlayer
10{
11 public override void Play()
12 {
13 Console.WriteLine("Playing MP3 music");
14 }
15}
16
17public class WavPlayer : MusicPlayer
18{
19 public override void Play()
20 {
21 Console.WriteLine("Playing WAV music");
22 }
23}
در مثال بالا کلاس MusicPlayer
دارای یک متد «مجازی» (Virtual) به نام Play
است. کلاسهای Mp3Player
و WavPlayer
متد Play
از این کلاس را به ترتیب برای پخش موسیقی MP3 و WAV بازنویسی میکنند. این مثال چندریختی زمان اجرا در سی شارپ را نشان میدهد. در ادامه نحوه ایجاد شی از کلاس MusicPlayer
و استفاده از چندریختی در برنامه توضیح داده شده است.
1MusicPlayer player = new Mp3Player();
2player.Play(); // Output: Playing MP3 music
3
4player = new WavPlayer();
5player.Play(); // Output: Playing WAV music
در قطعه کد بالا یکی شی از کلاس Mp3Player
ساخته و به متغیری از نوع MusicPlayer
اختصاص داده شده است. سپس، شی player
متد Play
از کلاس Mp3Player
را فراخوانی میکند. در ادامه یکی شی از کلاس WavPlayer
ساخته شده و متغیر player
به آن اختصاص داده شده است. با فراخوانی دوباره متد Play
توسط شی player
این متد از کلاس WavPlayer
اجرا میشود. خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
Playing MP3 music Playing WAV music
بعد از تکمیل مبحث چندریختی در ادامه نوشته شی گرایی در سی شارپ به سراغ آخرین اصل شی گرایی یعنی انتزاع خواهیم رفت.
انتزاع در سی شارپ چیست؟
انتزاع در برنامه نویسی شی گرا به فرایند پنهان کردن جزئیات پیادهسازی و افشا کردن ویژگیهای اساسی یک شی اشاره دارد. به زبان ساده تاکید اصل انتزاع بیشتر بر روی کاری است که یک شی انجام میدهد تا چگونگی انجام آن. برای فراگیری اصول شی گرایی در سی شارپ در قالب پروژههای عملی میتوانید فیلم آموزش پروژه محور پیادهسازی سیستم مدیریت کارمندان فرادرس که لینک آن در ادامه آورده شده است را مشاهده کنید.
برای درک بهتر مفهوم انتزاع در برنامه نویسی یک گوشی هوشمند را در نظر بگیرید. در زمان استفاده از گوشی هوشمند نیازی به درک پیچیدگیهایی همچون نحوه عملکرد اجزای داخلی آن نظیر پردازنده و حافظه نیست. برای استفاده از قابلیتهای گوشی هوشمند تنها کافی است تا نحوه کار با رابط کاربری برای برقراری تماس، ارسال پیام یا استفاده از اپلیکیشن را بلد باشید. این مثال به اصل انتزاع در برنامه نویسی شی گرا بسیار نزدیک است.
مفهوم انتزاع در برنامه نویسی چیست؟
انتزاع یکی از اصول مهم برنامه نویسی شی گرا است که به توسعه دهندگان امکان میدهد تا طرحی اولیه برای ساخت یک کلاس را ایجاد کنند. برای این منظور باید چند متد انتزاعی ایجاد کرد تا توسط کلاسهای مشتق شده پیادهسازی شوند. با استفاده از این مفهوم میتوان ساختار یک کلاس را بدون ارائه جزئیات پیادهسازی مشخص کرد. در مجموع باید عنوان کرد که انتزاع در برنامه نویسی به ما امکان میدهد تا پیچیدگیهای سیستم را پنهان کرده و تنها جزئیات لازم را در معرض دید کاربران قرار دهیم.
انتزاع به عنوان یکی از اصول شی گرایی در سی شارپ از طریق کلاسها و اینترفیسهای انتزاعی قابل پیادهسازی است. در ادامه این بخش از نوشته به بررسی این دو مفهوم حیاتی خواهیم پرداخت.
کلاس انتزاعی چیست؟
کلاس انتزاعی کلاسی است که قابلیت نمونهسازی ندارد و شی جدیدی از این کلاس ساخته نمیشود. این کلاس میتواند شامل هر دو متد انتزاعی و غیرانتزاعی باشد. متد انتزاعی فاقد بدنه است و باید توسط کلاسهای مشتق شده پیادهسازی شود. قطعه کد زیر کلاس انتزاعی در سی شارپ را نشان میدهد.
1public abstract class Animal
2{
3 public abstract void Speak();
4}
5
6public class Dog : Animal
7{
8 public override void Speak()
9 {
10 Console.WriteLine("The dog barks");
11 }
12}
13
14public class Cat : Animal
15{
16 public override void Speak()
17 {
18 Console.WriteLine("The cat meows");
19 }
20}
در مثال بالا کلاس Animal
یک کلاس انتزاعی است که یک متد انتزاعی با نام Speak
دارد. کلاسهای Dog
و Cat
از کلاس Animal
ارثبری میکنند و هر کدام پیادهسازی جداگانهای برای متد انتزاعی Speak
ارائه میدهند. مثال بالا نمونهای از انتزاع با استفاده از کلاسهای انتزاعی در سی شارپ را نشان داد.
اینترفیس در سی شارپ چیست؟
اینترفیس یک نوع مرجع در سی شارپ است که قراردادی برای پیادهسازی کلاسها را تعریف میکند. در واقع، اینترفیس در سی شارپ به تعریف کلاسها، متدها، مشخصهها و فیلدها بدون پیادهسازی آنها میپردازد. قطعه کد زیر پیادهسازی اینترفیس در سی شارپ را نشان میدهد.
1public interface IFlyable
2{
3 void Fly();
4}
5
6public class Bird : IFlyable
7{
8 public void Fly()
9 {
10 Console.WriteLine("The bird flies");
11 }
12}
13
14public class Airplane : IFlyable
15{
16 public void Fly()
17 {
18 Console.WriteLine("The airplane flies");
19 }
20}
در مثال بالا اینترفیس IFlyable
متد Fly()
را تعریف میکند. سپس، کلاسهای Bird
و Airplane
اینترفیس IFlyable
را پیادهسازی میکنند و هر کدام پیادهسازی جداگانهای برای متد Fly
ارائه میدهند. مثال بالا نمونهای از انتزاع با استفاده از اینترفیسها در سی شارپ را نشان داد.
تقویت برنامه نویسی سی شارپ با دورههای فرادرس
یکی از بهترین گزینهها برای بهبود مهارتهای برنامه نویسی دنبال کردن آموزشهای پروژه محور است. بر همین اساس در پلتفرم فرادرس آموزشهای پروژه محور متعددی در حوزه برنامه نویسی سی شارپ وجود دارد که میتوانید از این آموزشها برای تقویت مهارتهای برنامه نویسی خود استفاده کنید.
برای دسترسی به مجموعه فیلمهای آموزش برنامه نویسی سی شارپ فرادرس میتوانید از لینک زیر استفاده کنید.
در ادامه برخی از عناوین پیشنهادی که در فهرست آموزشهای برنامه نویسی سی شارپ فرادرس قرار دارند، آورده شده است.
جمعبندی
شی گرایی یک الگوی برنامه نویسی کارآمد در سی شارپ است که پایهای قدرتمند را برای توسعه نرمافزار ارائه میدهد. زبان برنامه نویسی سی شارپ از زمان پیدایش خود با بروزرسانی مداوم و ارائه ویژگیهای جدید به صورت پیوسته توانسته پیشرفتهای بسیار خوبی را برای پشتیبانی موثر از مفاهیم برنامه نویسی شی گرا داشته باشد. توسعه دهندگان با استفاده درست و بهجا از شی گرایی در سی شارپ میتوانند کدهایی ماژولار، با قابلیت استفاده مجدد و نگهداری بالا ایجاد کنند. شی گرایی مفهومی مشترک در بین تمام زبانهای برنامه نویسی برای افزایش معلومات خود در این حوزه میتوانید فیلمهای آموزشی مجموعه آموزش برنامه نویسی شی گرا فرادرس که لینک آن در ادامه آورده شده است را مشاهده کنید.
با توجه به اهمیت برنامه نویسی شی گرا در سی شارپ در این مطلب از مجله فرادرس مفاهیم شی گرایی در سی شارپ به طور کامل همراه با چندین مثال عملی مورد بررسی قرار گرفت. همچنین به اصول اساسی برنامه نویسی شی گرا در سی شارپ و مزایای آنها در توسعه نیز پرداخته شد.
source