تعداد بازدید:

چندریختی یا polymorphism در جاوا

برای دانلود ویدئو روی دکمه دانلود کلیک کنید

در بحث وراثت ما با مفهوم polymorphism یا چندریختی مواجه هستیم که یکی از قابلیت های مهم در شی گرایی می باشد . بوسیله چند ریختی می توان متغیر ها و توابع مرجع را طوری ایجاد نمود که در قسمت های مختلف برنامه رفتارهای متفاوتی داشته باشند.

تابع مرجع در کلاس والد باز نویسی در کلاس فرزند

با استفاده از نمودار بالا می تونیم تعریفی که در پارگراف اول از چندریختی دادیم رو بسط بدیم. قسمت های مختلف برنامه میتونه همون کلاس هایی باشه که به عنوان فرزند برای ماژول های مختلف استفاده میشه.

انواع چند ریختی ( polymorphism ) در جاوا

ما در جاوا دو نوع چند ریختی داریم :

  • polymorphism زمان اجرا (overriding) : در این نوع ما یک تابع بازنویسی شده رو در نظر میگیریم . از بین بردن متد کلاس والد و پیاده سازی عملکرد متد فرزند.(با همون نام و متد بازگشتی)
  • polymorphism زمان کامپایل (overloading) : در این نوع ما تابعی جدید با پارامتر های متفاوت داریم.(نام یکسان پارامتر متفاوت ، یا نوع خروجی متفاوت)

overriding (polymorphism run time)

کلاس Phone :

کلاس Nokia

می بینید که متد ringing از کلاس والد در کلاس فرزند بازنویسی شده. کد زیر یک نمونه از کلاس Nokia می سازه و متد ringing رو فراخوانی می کنه.

خروجی Nokia is ringing است.

overloading (polymorphism compile time)

کلاس Shape :

کلاس Rectangle :

کلاس Square :

خوب ما کلاس Shape رو داریم به عنوان کلاس والد و کلاس های Rectangle , Square رو داریم به عنوان کلاس های فرزند . در داخل کلاس های فرزند ما متد area که کارش بدست آوردن مساحت است رو با توجه به ساختار پارامتر های متفاوت داریم . حالا ما اگر در کلاس فرزند Rectangle متد area رو بدون پارامتر فراخوانی کنیم خروجی برای ما از متد والد گرفته میشه (Area is the quantity that expresses the extent of shape) و اگر پارامتر بدیم بهش از متد فرزند و مساحت رو به ما میده.

نکاتی در رابطه با overloading و overriding

  • اگر قصد overriding دارید میتونید نوع متغیر نمونه رو از نوع والد بگیرید اما اگر قصدر overloading دارید این کار رو بکنید خطای کامپایل به شما میده.
  • آرگومان ها و نوع برگشتی در override باید در کلاس فرزند و والد یکسان باشه.
  • نوع دسترسی در کلاس فرزند نباید محدودتر از کلاس والد باشه . به طور مثال اگر کلاس والد public باشه و کلاس فرزند private , protected باشه خطاست.
  • بحث overriding تنها زمانی مطرحه که بحث ارث بری باشه . در یک کلاس دو متد override نمی شن.
  • متد هایی که با کلمه کلیدی finall نوشته شده باشن اصطلاحا عقیم شدن و عمل override روی اون ها اتفاق نمی افته.
  • اگر متدی از نوع static باشه نمیتونیم در کلاس فرزند اون رو override کنیم و تنها می تونیم اون رو مجدد تعریف کنیم.
  • یک کلاس فرزند در یک پکیج واحد می تونه تمامی متدهای super class های موجود در همون پکیج رو override کنه مگر این که اون متد ها private باشن یا finall.
  • با استفاده از کلمه کلیدی super می توانیم به المان های کلاس والد داخل کلاس فرزند دسترسی داشته باشیم.

 

 

اشتراک گذاری :

مدرس دوره های جاوا اندروید و پایتون به صورت حضوری و مجازی

۰ دیدگاه برای چندریختی یا polymorphism در جاوا

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *