سلام دوستان.
من امیرحسین قربانی هستم و میخوام تو این مقاله که ادامه مقاله قبلی که مفهوم شی گرایی بود ، به طور کامل و ساده این مبحثو خدمتتون اراعه بدم. دوستانی هم که مقاله قبلی رو نخوندن ، حتما قبل از مطالعه این مقاله اول قبلی رو بخونن ;)
توی مقاله قبلی با نفهوم شی گرایی تا اینجا آشنا شدین که میدونین شی ( object ) چیه ، کلاس ( class ) چیه ، ویژگی و رفتار هر شی چیه و کاربردشون چی هستو تو دنیای برنامه نویسی به چه دردی میخورن .
حالا نیاز داریم برای مفهوم کامل تر شی گرایی و کار با اون تو حوضه برنامه نویسی ، 4 اصل کلی رو بدونیم :
1- Abstraction
2- Inheritance
3- Polymorphism
4- Encapsulation
Abstraction
به معنی انتزاعی بودن هست.
فرض کنین که میخوایم اطلاعات فردی چند نفر رو ذخیره کنیم. برای این کار باید کلاسی درست کنیم که شامل یک سری ویژگی مثل نام ، نام خانوادگی ، شماره تلفن و ... باشه.
توی این حالت ما نیازی نداریم که برای تک تک افراد کلاس مربوط به خودشون رو تعریف کنیم و هر کدوم یه حساب مخصوص به خودشونو داشته باشن. ( مثلا کلاس علی ، کلاس رضا و ... )
تنها کافیه که ویژگی های کلی رو در یه کلاس به نام کلاس حساب ، بنویسیم و به تعداد افراد موجود از روی کلاس ، شی تعریف کنیم .
این میشه معنی کلی انتزاعی بودن که خود کلاس وجود خارجی نداره ، بلکه object هایی که از روی کلاس ساخته میشن ، هر کدوم وجود خارجی پیدا میکنن .
//sakhte classe paye class Account { string first_name; string last_name; string phone_number; int age; string address; } // sakhte object hayi az classe paye Account ali_account = new Account(); Account reza_account = new Account(); Account mohammad_account = new Account();
Inheritance
به معنی ارث بری هست.
فرض کنین تو مثال قبل ما کلاسی رو ساختیم با عنوان کلاس حساب ( Account Class ) برای ذخیره یک سری ویژگی های کلی از افراد .
حالا فرض کنین که افرادی که یک سری ویژگی های مجزایی رو برای بعضی افراد در نظر گرفتیم و میخوایم بر اساس اون ها ، فرمی که افراد پر میکنن برای ذخیره اطلاعات خودشون ، با بقیه فرق داشته باشه . مثلا یک سری ویژگی هایی مخصوص افراد شاغل ، یکسری ویژگی مخصوص افراد دانشجو و ... داشته باشیم . ( برای افراد شاغل مثلا صمت شغلیشون ، حقوق ماهانه و ... و برای افراد دانشجو ، رشته تحصیلی و کد دانشجوییشون )
توی این حالت ما تنها کافیه که 2 کلاس با عنوان کلاس افراد دانشجو و کلاس افراد شاغل درست کنیم و این 2 کلاس رو ارث بری کنیم از کلاس اصلی و پایمون که کلاس حساب افراد هست .
تو این حالت دیگه نیازی نیست که دوباره ویژگی هایی که تو کلاس پایه داشتیم رو دوباره از اول برای 2 کلاس دیگه بنویسیم ، بلکه اون ها سر جاشون هست و بر اساس کلاس مشتق شده از کلاس پایه ، ویژگی های جدید به کلاس پایه برای اون افراد اضافه میشه .
به طور کلی مثلا تو کلاس دانشجو تنها کافیه که شماره دانشجویی و رشته تحصیلی رو بنویسیم ، نه بیشتر .
اینجوری تعداد کد کمتری مینویسیم و از کد های قبلی که برای کلاس پایه نوشتیم ، دوباره استفاده میکنیم .
class StudentAccount : Account { int student_number; string grade_of_study; } class EmployeeAccount : Account { string job; int amount; }
Polymorphism
به معنی چند شکلی هست .
برمیگیردیم مثال قبل . فرض کنین تو کلاس پایمون 2 رفتار خیلی ساده داشته باشیم که متد هایی هستند که فقط مقدادیری رو بر میگردونن . متد اول نامو نام خانوادگی و متد دوم تمام ویژگی هارو برمیگردونه .
این متد ها از طریق کلاس های مشتق شده ( که کلاس فرد دانشجو و کلاس فرد شاغل بود ) نیز قابل دسترسی هستند ( با این که این متد ها فقط تو کلاس پایه تعریف شدند ) .
حالا فرض کنین همین متد ها در کلاس های دانشجو و شاغل نیز باشند ، ولی با این تفاوت که علاوه بر ویژگی های کلاس پایه ، ویژگی های مربوط به هر کدوم رو هم برگردونه .
تو این حالت که نوع خاصی از متد پایه بازنویسی شده ( با همون نام و همون خروجی ) اصطلاحا میگن override کردن متد و به این عملیات در برنامه نویسی شی گرایی میگن
class Account { string first_name; string last_name; string phone_number; int age; string address; public virtual string returnAllFields(); } class StudentAccount : Account { int student_number; string grade_of_study; public override string returnAllFields(); } class EmployeeAccount : Account { string job; int amount; public override string returnAllFields(); }
Encapsulation
به معنی کپسوله سازی هست .
ما تو زندگی روزانه خودمون به چیزی میگیم کپسول که توسط یه پوسته ای محتویات داخل خود خودش رو در عین حال که دور هم نگه میداره ، از محیط بیرون هم حفظ کنه .
توی برنامه نویسی شی گرا هم ما تقریبا همچین چیزی رو داریم . وقتی کلاسی رو تعریف میکنیم در حقیقت تمام فیلد ها و متد های داخلش رو داریم کپسوله سازی میکنیم .
شاید سوال پیش بیاد که پس چطوری توسط کلاس های دیگه ، از متد ها و فیلد های داخل این کلاس استفاده کنیم ؟
با ساختن شی از روی کلاس مورد نظر و فقط میتونیم به اجزایی دسترسی داشته باشیم که عمومی ( public ) تعریف شده باشن . اگر خصوصی باشن اصلا نمیشه دسترسی داشت . البته دسترسی به این معنی نیست که به ساختار اون متد دسترسی داشته باشیم ، بلکه فقط میتونیم از کارایی نهایی اون استفاده کنیم . لزومی هم نیست که بدونیم چطور ساخته و پیاده سازی شده . ما خیلی وقت ها تو زندگی روزمره خودمون از لوازمی استفاده میکنیم که نمیدونیم داخل اون ها داره چه اتفاقی میوفته و چطور ساخته شده و اصلا لازم هست نیست که بدونیم . ما فقط نتیجه نهایی رو انتظار داریم . تو سیستم شی گرایی برنامه نویسی هم دقیقا همینطور هستش .
خب دوستان به آخر مقاله شی گرایی به زبون ساده رسیدیم . ممنونم ازتون که وقت گذاشتین و مقاله من رو خوندین . امیدوارم که تونسته باشم توسط این مقاله کمکی به درک شی گرایی براتون کرده باشم .
موفق باشید :)