Published on

روش‌های Overloading و Overriding در زبان جاوا

نویسندگان

روش‌های Overloading و Overriding در زبان جاوا

در زبان برنامه‌نویسی جاوا، دو مفهوم Method Overloading و Method Overriding از اصول اصلی شی‌گرایی محسوب می‌شوند. این دو قابلیت به ما امکان می‌دهند تا رفتار متدها را بسته به شرایط تغییر دهیم و در عین حال کد خود را انعطاف‌پذیرتر و خواناتر کنیم. در ادامه، این دو مفهوم به تفصیل توضیح داده می‌شوند.


Method Overloading

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

ویژگی‌ها:

  • انعطاف‌پذیری: این قابلیت امکان تعریف متدهایی با کاربردهای مختلف اما با یک نام یکسان را فراهم می‌کند.
  • چندریختی در زمان کامپایل: انتخاب متد مناسب در زمان کامپایل صورت می‌گیرد.

مثال:

class Calculator {
    // جمع دو عدد صحیح
    int add(int a, int b) {
        return a + b;
    }

    // جمع سه عدد صحیح
    int add(int a, int b, int c) {
        return a + b + c;
    }

    // جمع دو عدد اعشاری
    double add(double a, double b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println(calc.add(2, 3));       // فراخوانی متد با دو عدد صحیح
        System.out.println(calc.add(2, 3, 4));   // فراخوانی متد با سه عدد صحیح
        System.out.println(calc.add(2.5, 3.5));  // فراخوانی متد با دو عدد اعشاری
    }
}

در این مثال، متد add به سه روش مختلف پیاده‌سازی شده است که بسته به تعداد و نوع ورودی‌ها متد مناسب انتخاب می‌شود.


Method Overriding

Overriding زمانی اتفاق می‌افتد که یک کلاس فرزند متدی با همان نام، امضا (Signature) و نوع بازگشتی متد کلاس والد را دوباره تعریف کند. این قابلیت به ما اجازه می‌دهد رفتار متد والد را در کلاس فرزند تغییر دهیم.

ویژگی‌ها:

  • چندریختی در زمان اجرا: انتخاب متد مناسب در زمان اجرا صورت می‌گیرد.
  • انعطاف‌پذیری در کلاس‌های فرزند: امکان بازنویسی رفتار متد کلاس والد وجود دارد.
  • قوانین:
    • امضای متد باید دقیقا مشابه متد کلاس والد باشد.
    • نمی‌توان سطح دسترسی متد را محدودتر کرد.
    • از علامت @Override برای شفاف‌سازی و جلوگیری از خطا استفاده می‌شود.

مثال:

// کلاس والد
class Animal {
    void sound() {
        System.out.println("Animal makes a sound");
    }
}

// کلاس فرزند
class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Dog barks");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog(); // Upcasting

        myAnimal.sound(); // اجرای متد کلاس والد
        myDog.sound();    // اجرای متد بازنویسی‌شده کلاس فرزند
    }
}

در این مثال، متد sound در کلاس Dog رفتار جدیدی تعریف می‌کند و در زمان اجرا متد کلاس فرزند فراخوانی می‌شود.


تفاوت‌های Overloading و Overriding

ویژگیOverloadingOverriding
تعریفتعریف متدهایی با نام یکسان اما امضای متفاوت در یک کلاس.بازنویسی متد با همان امضا در کلاس فرزند.
نوع چندریختیدر زمان کامپایلدر زمان اجرا
سطح دسترسیمحدودیتی نداردنمی‌توان محدودتر از والد باشد.
نوع بازگشتیمی‌تواند متفاوت باشدباید یکسان یا هم‌خوان (Covariant) باشد.
متدهای استاتیکمی‌توان Overload کردنمی‌توان Override کرد.

نتیجه‌گیری

  • از Overloading زمانی استفاده می‌شود که بخواهید متدهایی با نام مشابه، اما ورودی‌های متفاوت تعریف کنید.
  • از Overriding زمانی استفاده می‌شود که بخواهید رفتار متد والد را در کلاس فرزند بازنویسی کنید.