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

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

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

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

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

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

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

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

overriding (polymorphism run time)

کلاس Phone :

public class Phone {
    public void ringing(){
        System.out.println("phone is ringing");
    }
}

کلاس Nokia

public class Nokia extends Phone {
    public void ringing(){
        System.out.println("Nokia is ringing");
    }
}

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

public class MyClass {
    public static void main (String args[]){
        Phone a = new Phone();
        Phone b = new Nokia();

        a.ringing();
        b.ringing();
    }
}

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

overloading (polymorphism compile time)

کلاس Shape :

public class Shape {
    public void area(){
        System.out.println("Area is the quantity that expresses the extent of shape");
    }
}

کلاس Rectangle :

public class Rectangle {
    public void area(int X , int Y){
        System.out.println("Area of Rectangle is: " + X*Y);
    }
}

کلاس Square :

public class Square {
    public void area(int X){
        System.out.println("Area of Squre is: " + X*X);
    }
}

خوب ما کلاس 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 می توانیم به المان های کلاس والد داخل کلاس فرزند دسترسی داشته باشیم.

 

 

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

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

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

دیدگاهتان را بنویسید

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