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

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

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

زمانی که کلاسی چندین متد همنام با پارامترهای مختلف دارد، در اصطلاح برنامه نویسی شی گرا به آن method overloading می گویند. در برنامه ای که توسعه دهنده مجبور است به اجرای تنها یک عملیات است، داشتن چندین متد همنام می تواند در افزایش خوانایی کد اپلیکیشن نقش اساسی ایفا کند.

فرض بگیرید که در برنامه ی کوچکی تنها باید یک عملیات ساده ی جمع را انجام دهید اما تعداد آرگومان ها می تواند متغیر باشد. حال اگر کد را به این صورت بنویسید: a(int, int) و b(int, int, int) قطعا برای شما و سایر برنامه نویسان درک رفتار، قابلیت ها آن سخت می شود چرا که اسم متدی که قرار است عملیاتی یکسان را انجام دهد، متفاوت است. با بهره گیری از قابلیت method overloading این مشکل را برطرف می کنیم.

مزیت استفاده از method overloading

method overloading قابلیت خوانایی برنامه و کد را بالا می برد.

روش های مختلف overload کردن یک متد/ارسال پارامترهای مختلف به چندین متد همنام

دو روش مختلف برای overload کردن متد در Java وجود دارد که در زیر به آن ها اشاره می کنیم:

  1. با تغییر دادن تعداد آرگومان ها
  2. با تغییر دادن نوع داده ای (data type) پارامتر ورودی

در Java صرف تغییر دادن نوع بازگشتی (return type) متد نمی توان یک متد را overload کرد.

overload کردن متد: تغییر دادن تعداد آرگومان های ورودی

در مثال جاری، دو متد با نام یکسان ()add داریم که یکی دو عدد را جمع می کند و دیگری سه عدد را.

در این مثال، دو متد static ایجاد می کنیم تا برای فراخوانی آن ها نیازی به ساختن آبجکت از روی کلاس میزبان آن ها وجود نداشته باشد.

class Adder{  
static int add(int a,int b){return a+b;}  
static int add(int a,int b,int c){return a+b+c;}  
}  
class TestOverloading1{  
public static void main(String[] args){  
System.out.println(Adder.add(11,11));  
System.out.println(Adder.add(11,11,11));  
}}

overload کردن متد: تغییر نوع داده ای آرگومان های ورودی توابع

در مثال جاری، دو متد تعریف می کنیم که نوع داده ای آرگومان های ارسالی به آن ها بایکدیگر متفاوت است. اولین متد ()add دو آرگومان از جنس عدد صحیح و int دریافت می کند. دومین متد add() دو آرگومان عددی از جنس اعشاری/double دریافت می کند.

class Adder{  
static int add(int a, int b){return a+b;}  
static double add(double a, double b){return a+b;}  
}  
class TestOverloading2{  
public static void main(String[] args){  
System.out.println(Adder.add(11,11));  
System.out.println(Adder.add(12.3,12.6));  
}}

چرا overload کردن متد با صرف تغییر دادن نوع بازگشتی و خروجی تابع ممکن نیست؟

در زبان Java، نمی توان به صرف ویرایش نوع خروجی (return type) متد، آن متد را overload کرد چرا که سبب ایجاد ابهام برای کامپایلر و خطا در ترجمه ی برنامه می شود. در زیر این ابهام را مشاهده می کنید:

class Adder{  
static int add(int a,int b){return a+b;}  
static double add(int a,int b){return a+b;}  
}  
class TestOverloading3{  
public static void main(String[] args){  
System.out.println(Adder.add(11,11));//ابهام
}}

آیا می توان متد main را در جاوا overload کرد؟

در پاسخ باید گفت بلی با استفاده از تکنیک method overloading می توان این کار را انجام داد. در واقع توسعه دهنده می تواند با استفاده از overloading چندین متد main در کلاس جاوای خود داشته باشد. اما لازم به ذکر است که دستگاه مجازی جاوا (JVM) تنها آن متد main() ای که آرایه ی رشته ای (Strings[] args) را به عنوان ورودی دریافت کرده را صدا می زند. به مثال زیر دقت کنید:

class TestOverloading4{  
public static void main(String[] args){System.out.println("main with String[]");}  
public static void main(String args){System.out.println("main with String");}  
public static void main(){System.out.println("main without args");}  
}

Method overloading و Type promotion (تبدیل ضمنی نوع)

چنانچه نوع داده ای منطبقی پیدا نشود، یک نوع به نوع دیگری به صورت ضمنی تبدیل می شود (type promotion). با دقت به تصویر زیر این امر را بهتر می فهمید:

همان طور که در نمودار بالا مشاهده می کنید، نوع داده ای byte می تواند به short، int، long، float یا double تبدیل شود. نوع داده ای short نیز قابل تبدیل به int، long، float یا double می باشد. نوع داده ای char به int، long، float یا double و غیره قابل تبدیل ضمنی می باشد.

مثال کاربردی از overloading با تبدیل ضمنی نوع یا type promotion

class OverloadingCalculation1{  
  void sum(int a,long b){System.out.println(a+b);}  
  void sum(int a,int b,int c){System.out.println(a+b+c);}  
  public static void main(String args[]){  
  OverloadingCalculation1 obj=new OverloadingCalculation1();  
  obj.sum(20,20);//now second int literal will be promoted to long  
  obj.sum(20,20,20);  
  }  
}

مثال کاربردی از method overloading با تبدیل ضمنی نوع در صورت وجود آرگومان از نوع منطبق در متد

در صورت وجود آرگومان هایی که از نظر نوع داده ای با هم منطبق هستند در متد مورد نظر، type promotion یا تبدیل ضمنی نوع داده ای صورت نمی گیرد.

class OverloadingCalculation2{  
  void sum(int a,int b){System.out.println("int arg method invoked");}  
  void sum(long a,long b){System.out.println("long arg method invoked");}  
  public static void main(String args[]){  
  OverloadingCalculation2 obj=new OverloadingCalculation2();  
  obj.sum(20,20);//now int arg sum() method gets invoked  
  }  
}

مثال کاربردی از method overloading با تبدل ضمنی نوع در صورت وجود ابهام در خصوص نوع داده ای آرگومان ها

اگر هیچ آرگومانی که از نظر نوع داده ای منطبق باشند به متد ارسال نشده باشد و هر متد تعداد یکسان آرگومان را به صورت ضمنی تبدیل کند، به طور قطع ابهام رخ خواهد داد.

class OverloadingCalculation3{  
  void sum(int a,long b){System.out.println("a method invoked");}  
  void sum(long a,int b){System.out.println("b method invoked");}  
  public static void main(String args[]){  
  OverloadingCalculation3 obj=new OverloadingCalculation3();  
  obj.sum(20,20);//now ambiguity  
  }  
}

یک نوع داده ای هست که به صورت ضمنی قابل بازگشت به نوع دیگری به صورت ضمنی نیست، برای مثال double قابل depromote به هر نوع داده ای نمی باشد.


برچسب ها