مفهوم کلاس و اشیا در شی گرایی چیست؟
شی گرایی تکنیکی است که دنیای برنامه نویسی را به دنیای واقعی تشبیه میکند. کلاس و اشیا از مهمترین مفاهیم در برنامه نویسی شی گرا به شمار میرود. کلاس یک الگوی تعریف شده از طرف کاربر است که اشیا از آن ساخته میشود. در زبان برنامه نویسی #C کلاسها از وراثت و polymorphism پشتیبانی میکنند. Object Oriented Programming عنصر اصلی در دات نت به شمار میرود. برنامه نویسی شی گرا بر اساس اشیا و کلاس است. یک کلاس برای اتصال دادهها و متدها به صورت ترکیبی استفاده میشود.
یک شی نمونه کلاس است، که به برنامه نویس کمک میکند تا از متغیر و متدهای کلاس استفاده کند. همه چیز در اطرف ما مثل یک کلاس است حتی آبی که میخوریم ترکیبی از هیدروژن و اکسیژن است. بنابراین یک کلاس مجموعهای از ویژگیهایی است که یک موجودیت را تعریف میکند. در هر زمان رفتار یک شی به عنوان متد پیاده سازی میشود.
همه چیز در #C با کلاسها و اشیا همراه با ویژگیها و متدها همراه هست. برای اینکه بهتر متوجه این مفاهیم شوید به مثالی در دنیای واقعی مثل ماشین نگاه کنید. ماشین یک شی است دارای ویژگیهایی مانند رنگ، موتور، تایر و روشهایی مانند رانندگی و ترمز است. یک کلاس مانند یک طرح یا الگو برای ایجاد اشیا به شمار میرود. برای ایجاد یک کلاس، از کلمه کلیدی Class استفاده میشود. برای مثال یک کلاس به نام “car” با رنگ متغیر ایجاد می کنیم:
class Car { string color = "white"; }
برای ایجاد شی، از یک کلاس استفاده میکنیم. در مثال بالا یک کلاس ایجاد کردیم بنابراین میتوانیم از آن برای ایجاد اشیا استفاده کنیم. برای ایجاد شی از Car، نام کلاس را مشخص کرده و از کلمه کلیدی New استفاده میکنیم. یک شی به نام MyObj ایجاد کنید و از آن برای چاپ مقدار رنگ استفاده کنید:
using System; namespace MyApplication { class Car { string color = "white"; static void Main(string[] args) { Car myObj = new Car(); Console.WriteLine(myObj.color); } } }
سطح دسترسی یا Access Modifiers در سی شارپ
سطح دسترسی در زبان سی شارپ برای تعیین محدوده دسترسی اعضای یک کلاس استفاده میشود. در #C شش نوع Access Modifier وجود دارد که به توضیح چند مورد میپردازیم:
- عمومی یا public: هیچ محدودیتی برای دسترسی به اعضای عمومی وجود ندارد.
- خصوصی یا private: در این مورد دسترسی به کلاس محدود میشود.
- محافظت شده یا producted: دسترسی محافظت شده محدود به تعریف کلاس و هر کلاسی که از کلاس ارثبری میکند.
- داخلی یا Internal: فقط در فضای نامی خودش قابل دسترس است.
اگر میخواهید در مورد سطح دسترسی بیشتر بدانید پیشنهاد میکنیم به مقاله آموزش شی گرایی فرادرس مراجعه کنید.
Private Modifier
اگر فیلدی را با استفاده از دسترسی خصوصی بخوانید، فقط در همان کلاس قابل دسترسی است. به مثال زیر توجه کنید:
class Car { private string model = "Mustang"; static void Main(string[] args) { Car myObj = new Car(); Console.WriteLine(myObj.model); } }
خروجی به این صورت خواهد بود:
Mustang
اگر بخواهید خارج از کلاس به آن دسترسی پیدا کنید، در خروجی خطا رخ میدهد. برای اینکه بیشتر متوجه شوید به این مثال توجه کنید:
class Car { private string model = "Mustang"; } class Program { static void Main(string[] args) { Car myObj = new Car(); Console.WriteLine(myObj.model); } }
خروجی نشان میدهد:
'Car.model' is inaccessible due to its protection level The field 'Car.model' is assigned but its value is never used
Public Modifier
اگر فیلدی را با دسترسی عمومی اعلام کنید، برای همه کلاسها قابل دسترسی خواهد بود. مثال زیر را در نظر بگیرید:
class Car { public string model = "Mustang"; } class Program { static void Main(string[] args) { Car myObj = new Car(); Console.WriteLine(myObj.model); } }
Mustang
اگر برنامه نویسی به طور پیشفرض سطح دسترسی را مشخص نکند همه اعضای یک کلاس خصوصی خواهند بود.
کپسوله سازی یا Encapsulation در سی شارپ
در ادامه پست pdf آموزش شی گرایی در سی شارپ به مبحث کپسوله سازی میرسیم. در زبان برنامه نویسی کپسوله سازی یا Encapsulation به ترکیب دادهها و روشهایی که روی آن دادهها کار میکنند و دادهها را در یک واحد قرار میدهد، میگویند. هدف از کپسوله سازی جلوگیری از تغییر دادهها است. این دادهها فقط توسط توابع دریافت کننده کلاس قابل دسترسی هستند. برنامه نویسان در بسیاری از زبانهای برنامه نویسی از کپسوله سازی در قالب کلاس استفاده میکنند.
یک کلاس نمونهای از کپسوله سازی است که شامل دادهها و روشهایی است که در یک واحد جمع آوری شده است. برنامه نویس از کپسوله سازی برای محدود کردن دسترسی مستقیم به برخی از اجزای یک شی استفاده میکند.
کپسوله سازی برای پنهان کردن اعضای داده و توابع داده یا روش های مرتبط با یک کلاس یا شی نمونه کاربرد دارد، به عبارتی برنامه نویس با استفاده از کپسوله سازی از دسترسی به جزییات پیاده سازی جلوگیری میکند. کپسوله سازی با استفاده از تعیین سطح دسترسی یا Access Modifer اجرا و پیاده سازی میشود. به مثال زیر توجه کنید، کلاسی ایجاد کردهایم که دادهها را کپسوله میکند:
namespace AccessSpecifiers { class Student { // Creating setter and getter for each property public string ID { get; set; } public string Name { get; set; } public string Email { get; set; } } } using System; namespace AccessSpecifiers { class Program { static void Main(string[] args) { Student student = new Student(); // Setting values to the properties student.ID = "101"; student.Name = "Mohan Ram"; student.Email = "mohan@example.com"; // getting values Console.WriteLine("ID = "+student.ID); Console.WriteLine("Name = "+student.Name); Console.WriteLine("Email = "+student.Email); } } }
بعد از اجرا خروجی برنامه اینگونه خواهد بود:
ID = 101 Name = Mohan Ram Email = mohan@example.com
وراثت یا Inheritance در سی شارپ
در زبان برنامه نوسی #C وراثت به فرایندی گفته میشود که در آن یک شی تمام رفتارهای خود را به طور خودکار از شیء والد به دست میآورد. بنابراین میتوان با استفاده از Inheritance از ویژگیهایی که در یک کلاس دیگر تعریف شده است دوبار استفاده کنید یا آن را گسترش دهید. در #C به کلاسی که اعضای یک کلاس دیگر را به ارث مییرد کلاس مشتق شده میگویند.
به کلاسی که اعضای آن به ارث برده میشود کلاس پایه میگویند. در وراثت ویژگی است که می توان از کدها استفاده مجدد کرد و نیازی به تعریف مجدد عضو نیست. بنابراین کد کمتری در کلاس استفاده میشود. زمانی که یک کلاس، کلاس دیگری را به ارث میبرد به آن وراثت تک سطحی میگویند. وراثت تک سطحی فقط فیلدها را به ارث میبرد. به مثال تک سطحی زیر توجه کنید:
using System; public class Employee { public float salary = 40000; } public class Programmer: Employee { public float bonus = 10000; } class TestInheritance{ public static void Main(string[] args) { Programmer p1 = new Programmer(); Console.WriteLine("Salary: " + p1.salary); Console.WriteLine("Bonus: " + p1.bonus); } }
خروجی به شکل زیر خواهد بود:
Salary: 40000 Bonus: 10000
در مثال بالا، به Employee کلاس پایه میگویند و به Programmer یک کلاس مشتق گفته میشود.
متد ارث بری یا Inheriting Methods در سی شارپ
در زیر مثالی از وراثت در زبان سی شارپ میزنیم که متدها را فقط به ارث میبرد:
using System; public class Animal { public void eat() { Console.WriteLine("Eating..."); } } public class Dog: Animal { public void bark() { Console.WriteLine("Barking..."); } } class TestInheritance2{ public static void Main(string[] args) { Dog d1 = new Dog(); d1.eat(); d1.bark(); } }
خروجی به شکل زیر خواهد بود:
Eating... Barking...
وراثت چند سطحی
در زبان سی شارپ هنگامی که یک کلاس، کلاس دیگری را به ارث میبرد که توسط کلاس دیگر به ارث میرسد، به عنوان وراثت چند سطحی شناخته میشود. به مثال زیر که از وراثت چند سطحی در زبان #C است نگاه کنید:
using System; public class Animal { public void eat() { Console.WriteLine("Eating..."); } } public class Dog: Animal { public void bark() { Console.WriteLine("Barking..."); } } public class BabyDog : Dog { public void weep() { Console.WriteLine("Weeping..."); } } class TestInheritance2{ public static void Main(string[] args) { BabyDog d1 = new BabyDog(); d1.eat(); d1.bark(); d1.weep(); } }
خروجی به شکل زیر خواهد بود:
Eating... Barking... Weeping...
کلاسهای انتزاعی یا Abstract Classes در سی شارپ
abstract در کلاسهای انتزاعی به عنوان کلمه کلیدی در تعریف کلاس به کار میرود. کلاسهای انتزاعی برای پنهان کردن جزییات استفاده میشود و فقط نمایش عملکرد را نشان میدهد. Abstract از دو راه به دست میآید:
- کلاسهای انتزاعی Abstract Classes
- رابط Interface
در کلاسهای انتزاعی و رابط، متدهای انتزاعی از ضروریات میباشد. برای ایجاد کردن یک شی نمیتوان از کلاس انتزاعی استفاده کرد. کلاسهای انتزاعی بیشتر در فریمورکها کاربرد دارند. در دانت نت (NET.) تعداد زیادی کلاس انتزاعی وجود دارد.
در زبان برنامه نویسی #C، میتوان از روش های انتزاعی و غیرانتزاعی استفاده کرد. پیاده سازی کلاسهای انتزاعی توسط کلاسهای مشتق شده ایجاد میشود. زبان برنامه نویسی سی شارپ یکی از کاربردیترین زبانهای برنامه نویسی است که میتوانید با مطالعه آن اطلاعات خود را در مورد این زبان افزایش دهید.
در زیر مثالی از کلاس انتزاعی در سی شارپ ارائه میدهیم که دارای یک متد انتزاعی ()draw است. اجرای آن توسط کلاس های مشتق شده ارائه می شود: Rectangle و Circle هر دو کلاس در نوع پیاده سازی تفاوت دارند:
using System; public abstract class Shape { public abstract void draw(); } public class Rectangle : Shape { public override void draw() { Console.WriteLine("drawing rectangle..."); } } public class Circle : Shape { public override void draw() { Console.WriteLine("drawing circle..."); } } public class TestAbstract { public static void Main() { Shape s; s = new Rectangle(); s.draw(); s = new Circle(); s.draw(); } }
خروجی برنامه به شکل زیر خواهد بود:
drawing ractangle... drawing circle...
متد انتزاعی Abstract Method
متد بدنه ندارد. برای ایجاد متد انتزاعی از کلمه کلیدی Abstract استفاده میکنیم. به مثال زیر توجه کنید:
public abstract void display();
در اینجا ()display یک متد انتزاعی است. یک متد انتزاعی فقط در داخل یک کلاس انتزاعی میتواند وجود داشته باشد. وقتی یک کلاس غیر انتزاعی از یک کلاس انتزاعی ارث بری میکند، باید به روشهای انتزاعی پیادهسازی کند.
مثال برای اجرای روشهای انتزاعی:
using System; namespace AbstractClass { abstract class Animal { // abstract method public abstract void makeSound(); } // inheriting from abstract class class Dog : Animal { // provide implementation of abstract method public override void makeSound() { Console.WriteLine("Bark Bark"); } } class Program { static void Main (string [] args) { // create an object of Dog class Dog obj = new Dog(); obj.makeSound(); Console.ReadLine(); } } } Output
در مثال بالا یک کلاس انتزاعی ایجاد کردیم به نام Animal و یک متد انتزاعی ()makesound در داخل کلاس وجود دارد. خروجی به شکل زیر خواهد بود:
Bark Bark
واسط یا Interface در سی شارپ
واسط طرحی از یک کلاس است. تمام متدهایی که در Interface اعلان میشوند، متدهای انتزاعی هستند. از واسط برای به دست آوردن وراثت چندگانه استفاده میشود که توسط کلاس نمیتوان به دست آورد. برای پیاده سازی Interface از کلاس یا ساختار استفاده میشود. کلاس یا ساختاری که واسط را پیاده سازی میکند باید تمام متدهای اعلام شده در داخل Interface را اجرا کند.
مثالی از Interface در سی شارپ می زنیم تا بهتر متوجه شوید، در مثال زیر متد ()draw وجود دارد که توسط دو کلاس Recatangle و Circle ارائه میشود.
using System; public interface Drawable { void draw(); } public class Rectangle : Drawable { public void draw() { Console.WriteLine("drawing rectangle..."); } } public class Circle : Drawable { public void draw() { Console.WriteLine("drawing circle..."); } } public class TestInterface { public static void Main() { Drawable d; d = new Rectangle(); d.draw(); d = new Circle(); d.draw(); } }
خروجی برنامه به این شکل خواهد بود:
drawing ractangle... drawing circle...
متدهای Interface به صورت پیش فرض عمومی و انتزاعی هستند.
چند ریختی یا Polymorphism در سی شارپ
این اصطلاح از دو کلمه “morphs” و “poly” تشکیل شده است که به معنی شکلها یا اشکال است. از کلمه یونانی گرفته شده است. در برنامه نویسی شی گرا از سه مفهوم مهم و اصلی وراثت، کپسوله سازی و چند شکلی استفاده میکنند. دونوع Polymorphism وجود دارد: Compile Time Polymorphism یا کامپایل زمان چند ریختی و Runtime Polymorphism Compile Time یا کامپایل زمان اجرا که در زبان برنامه نویسی سی شارپ به دست میآید که به عنوان اتصال اولیه شناخته میشود. Polymorphism زمان اجرا، با استفاده از متد نادیده گرفته میشود که اتصال دینامیکی میگویند. در زیر از Polymorphism زمان اجرا، مثالی میزنیم:
using System; public class Animal{ public virtual void eat(){ Console.WriteLine("eating..."); } } public class Dog: Animal { public override void eat() { Console.WriteLine("eating bread..."); } } public class TestPolymorphism { public static void Main() { Animal a= new Dog(); a.eat(); } }
خروجی به شکل زیر خواهد بود:
eating bread...
به مثال دیگری توجه کنید که در آن دو کلاس مشتق شده وجود دارد:
using System; public class Shape{ public virtual void draw(){ Console.WriteLine("drawing..."); } } public class Rectangle: Shape { public override void draw() { Console.WriteLine("drawing rectangle..."); } } public class Circle : Shape { public override void draw() { Console.WriteLine("drawing circle..."); } } public class TestPolymorphism { public static void Main() { Shape s; s = new Shape(); s.draw(); s = new Rectangle(); s.draw(); s = new Circle(); s.draw(); } }
خروجی برنامه به این شکل خواهد بود:
drawing... drawing rectangle... drawing circle...
Runtime Polymorphism توسط اعضای داده در سی شارپ قابل دستیابی نیست. در مثال زیر به فیلد توسط متغیر دسترسی وجود دارد که در آن به نمونه کلاس مشتق شده اشاره میکند:
using System; public class Animal{ public string color = "white"; } public class Dog: Animal { public string color = "black"; } public class TestSealed { public static void Main() { Animal d = new Dog(); Console.WriteLine(d.color); } }
white
سخن آخر در مورد pdf آموزش شی گرایی در سی شارپ
به پایان پست pdf آموزش شی گرایی در سی شارپ رسیدیم، بعد از مطالعه این مبحث امیدواریم مفاهیم شی گرایی را درک کرده باشید. با استفاده از شی گرایی در زبان برنامه نویسی نرم افزاری که به وسیله آن تولید میشود قابل فهمتر و درک آن سادهتر میشود.
برای درک بهتر و اصولیتر زبان برنامه نویسی #C توصیه میکنم مقاله آموزش برنامه نویسی سی شارپ از مبتدی تا پیشرفته را مطالعه کنید. زبان #C از قدرتمندترین زبانهای برنامه نویسی است که با یادگیری و کسب مهارت و پیاده سازی آن میتوانید بازار کار خوبی داشته باشید. با نظرات و پیشنهادات خود ما را در ادامه راه آموزش برنامه نویسی همراهی کنید. موفق و پیروز باشید.
4 پاسخ
مطالب گفته شده در این پست مثل همیشه کامل بود ممنون
شی گرایی رو خیلی خوب توضیح دادین. ممنون ازتون
مثل همیشه جامع و مفید و عالی خانم مهندس
ممنون لطف دارین