می 28, 2019 Mostafa بدون دیدگاه

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

توجه : درخواست افزونه ،قالب، اسکریپت و نرم افزار و ... و سوالات و مشکلات خود را در انجمن ارسال نمایید

زمانی که متدی در کلاس فرزند (subclass) با متدی از کلاس پدر (parent class) هم نام باشد، اما پیاده سازی اختصاصی خود از آن متد را در بدنه ارائه دهد، به آن بازنویسی بدنه یا پیاده سازی متد (method overriding) می گویند. به عبارت دیگر، زمانی که کلاس فرزند پیاده سازی متدی که در کلاس پدر قبلا تعریف شده است را در بدنه ی خود تغییر دهد در اصطلاح برنامه نویسی شی گرا به آن بازنویسی بدنه یا رفتار متد/method overriding گویند.

موارد استفاده ی method overriding

  • method overriding یا بازنویسی بدنه ی متد برای ارائه ی قابلیت اختصاصی خود از متدی است که قبلا در کلاس پدر تعریف شده است.
  • method overriding همچنین برای پیاده سازی runtime polymorphism (قابلیت انجام عملیات مختلف بر اساس آبجکتی در آن فراخوانی می شود در زمان اجرا) بکار می رود.

قوانینی که برای بازنویسی متد/method Overriding بایستی رعایت شود

  1. متد در کلاس فرزند بایستی با متد کلاس پدر همنام باشد.
  2. متد در کلاس فرزند بایستی از نظر پارامتر با متد کلاس پدر یکسان باشد.
  3. بایستی دارای رابطه ی IS-A یا وراثت (inheritance) باشد.

بدون قابلیت method overriding چه مشکلاتی رخ می دهد؟

در مثال زیر به صورت عملی می بینید که اگر از method overriding استفاده نکنید، در برنامه نویسی با چه مشکلی مواجه خواهید شد.

class Vehicle{  
  void run(){System.out.println("خودرو در حال حرکت است");}  
}  
class Bike extends Vehicle{  
  public static void main(String args[]){  
  Bike obj = new Bike();  
  obj.run();  
  }  
}

خروجی : خودرو در حال حرکت است

مشکل در مثال جاری این است که می بایست بدنه ی متد ()run از کلاس پدر را در کلاس فرزند بازنویسی کرده و قابلیت اختصاصی و مورد نیاز را در بدنه ی کلاس فرزند به آن اضافه می کردیم.

مثال کاربردی از بازنویسی بدنه ی متد (method overriding)

در مثال پیشرو، متد ()run از کلاس پدر را در کلاس فرزند نیز به همان صورت تعریف کردیم ولی بدنه و رفتار آن را بر اساس نیاز داخل کلاس فرزند، تغییر دادیم. اسم و پارامتر متد در دو کلاس یکسان است و همان طور که می بینید رابطه ی IS-A که همان وراثت است رعایت شده است. بنابراین در مثال کاربردی زیر method overriding به معنای واقعی در برنامه پیاده سازی شده است.

class Vehicle{  
void run(){System.out.println("خودرو در حال حرکت است");}  
}  
class Bike2 extends Vehicle{  
void run(){System.out.println("دوچرخه در حال حرکت است");}  
public static void main(String args[]){  
Bike2 obj = new Bike2();  
obj.run();  
}

خروجی : دوچرخه در حال حرکت است

مثال عملی از پیاده سازی بدنه ی متد در کلاس فرزند (method overriding)

سناریویی را در نظر بگیرید که در آن Bank کلاسی کلی (پدر) است که قابلیت آن ارائه ی نرخ پرداخت سود می باشد. اما نرخ سود با توجه به هر بانک متفاوت است. برای مثال، کلاس های SBI، ICICI و AXIS هر یک به ترتیب مقادیر 8%، 7% و 9% سود را ماهیانه پرداخت می کنند.

 

class Bank{  
int getRateOfInterest(){return 0;}  
}  
class SBI extends Bank{  
int getRateOfInterest(){return 8;}  
}  
class ICICI extends Bank{  
int getRateOfInterest(){return 7;}  
}  
class AXIS extends Bank{  
int getRateOfInterest(){return 9;}  
}  
class Test2{  
public static void main(String args[]){  
SBI s=new SBI();  
ICICI i=new ICICI();  
AXIS a=new AXIS();  
System.out.println("SBI Rate of Interest: "+s.getRateOfInterest());  
System.out.println("ICICI Rate of Interest: "+i.getRateOfInterest());  
System.out.println("AXIS Rate of Interest: "+a.getRateOfInterest());  
}  
}

آیا می توان متد static را نیز بازنویسی/ override کرد؟

متد static قابل بازنویسی نیست. این قضیه را با runtime polymorphism می توان ثابت کرد. در مباحث آتی به آن خواهیم پرداخت.

چرا نمی توان متد static را بازنویسی کرد؟

در شرح علت آن باید گفت که متد static به کلاس میزبان خود وابسته است در حالی که متد متعلق به نمونه ی کلاس (instance method) به آبجکت ساخته شده از روی کلاس متصل و وابسته می باشد. متدی که با کلیدواژه ی static علامت گذاری می شود، داخل class area (بخشی از حافظه که meta-data مربوط به کلاس در آن ذخیره می شود) و متدی که متعلق به نمونه یا آبجکت ساخته شده از روی کلاس می باشد (instance method) داخل heap area (جایی که آبجکت ها ذخیره می شوند) در حافظه فضا اشغال می کنند.

آیا می توان متد main را در جاوا بازنویسی (override) کرد؟

خیر چرا که متد main یک متد static است.


برچسب ها