بسم الله الرحمن الرحیم
سلام.
مبحث شئ گرایی آنقدر گسترده هست که به تنهایی چندین جلد کتاب درموردش نوشته شده. اما یکی از مواردی که مد نظر این حقیر بوده سادگی مطالب است. قصد نداریم که همه ریزه کاری ها رو به خورد مخاطبان بدهیم تا بجای اینکه از مطالب استفاده کند، دچار سردرگمی شود. در اینجا فقط مفاهیم پایه ای آموزش داده شده، بنابراین برای اینکه بتوانید نهایت استفاده رو از تکنیک های مختلف برنامه نویسی از جمله شئگرایی داشته باشید باید بعد از اینکه مطالب گفته شده رو بخوبی فرا گرفتید، به دنبال کتاب ها و مراجع دیگر در همین زمینه رفته و از آنها استفاده نمایید. و سعی کنید از همه چیزهایی که فرا می گیرید، در جایی از برنامه خود استفاده کنید. تمرین و تکرار فراموش نشود.
در جلسه قبل در مورد سطوح دسترسی اعضای کلاس توضیحاتی ارائه شد. در این درس سعی می کنیم شما رو با دو مفهوم بسیار مهم در برنامه نویسی شیئ گرا آشنا کنیم. مفاهیم Overload و Override هرچند بسیار شبیه به هم هستند، اما در ادامه، ضمن توضیح در مورد معنی این دو کلمه، به بررسی تفاوت های آنها می پردازیم.
در برنامه نویسی غیر شیئ گرا، می توانیم در یک قلمرو (scope) واحد متدهایی با نام یکسان داشته باشیم. بدین صورت که این متدها نام و نوع خروجی یکسانی دارند، اما پارامترهای ورودی متفاوتی خواهند داشت.
شاید این سوال در ذهن شما بوجود آمده باشد که متدهایی با نام یکسان و پارامترهای متفاوت، چه فایده ای دارد!؟
سوال بسیار بجایی هست. فرض کنیم متدی برای محاسبه محیط مربع داشته باشیم. احتمالا این متد بصورت زیر تعریف شده است:
public float Mohit(float s){ return(s*4); }
حال می خواهیم محیط محیط مستطیل را حساب کنیم، غافل از اینکه دیگه متد قبلی جوابگو نیست. یعنی باید یک متد جدید بسازیم که 2 پارامتر ورودی داشته باشد. خوب مشکلی نیست، یک متد با 2 پارامتر می سازیم. اما به این نکته هم فکر کنید. اگر بخواهیم برای چندضلعی های دیگر هم متد محاسبه محیط را بنویسیم باید چکار کنیم؟ آیا باید برای همه متدهای یک اسم منحصربفرد انتخاب کنیم؟ اگر چنین کاری انجام دهیم بعدا با این همه اسم، دچار سردرگمی نمی شویم؟
راه حل این مشکل عملیات Overloading هست. یعنی همانطور که گفتم متد های جدید نام یکسانی نسبت به قبلی ها دارند ولی تفاوت آنها در تعداد و نوع پارامترهای ورودی می باشد. برای محاسبه محیط مستطیل داریم:
public float Mohit(float s1, float s2){ return 2*(s1+s2); }
نکته: دقت کنید که متد محاسبه محیط مربع و متد مربوط به محاسبه مستطیل در کنار هم قرار دارند.
هرگاه به متد Mohit فقط یک آرگومان ارسال شود، محیط مربع محاسبه می شود. اما اگر به این متد 2 آرگومان ارسال شود، متد مربوط به محاسبه محیط مستطیل محاسبه خواهد شد.
مفهوم Override هم تقریبا مشابه Overload هست، با این تفاوت که Override در مواقعی مطرح می شود که بحث شیئ گرایی و ارث بری کلاس ها مطرح باشد.
فرض کنید یک کلاس بنام Shape داریم که در آن متدی به اسم Mohit تعریف شده باشد که محیط مربع را محاسبه می کند. دوباره فرض کنید کلاس دیگری بنام Circle تعریف کرده ایم که از کلاس Shape ارث بری می کند. یعنی کلاس Circle متد Mohit را از Shape به ارث برده است. اما این متد محیط مربع را محاسبه می کند، درحالی که ما به محاسبه محیط دایره نیاز داریم. اینجاست که باید این متد را Override کنیم. بصورت زیر:
Public class Shape{ public float Mohit(float s){ return s*4; } } Public class Circle:Shape{ public override float Mohit(float r){ return 2*3.14*r; } }
خسته نباشید عزیزان...
اگر سوالی داشتید، بپرسید. امیدوارم بتونم پاسخ بدم.
خدا نگهدار