چندریختی (Polymorphism)

چندریختی در جاوا: overriding، overloading و رفتار متفاوت یک رابط.

چندریختی چیست؟

«چند شکل» — یک فراخوانی، رفتارهای مختلف بسته به نوع شیء واقعی:

Animal a1 = new Dog();
Animal a2 = new Cat();

a1.makeSound();   ← واق واق (Dog!)
a2.makeSound();   ← میو (Cat!)

// یک متد، دو رفتار — این چندریختی است!

دو نوع چندریختی

۱. Overriding (زمان اجرا)

فرزند متد والد را بازنویسی می‌کند — JVM در زمان اجرا نوع واقعی را می‌فهمد:

public class Shape {
    double area() {
        return 0;
    }
}

public class Circle extends Shape {
    double radius;
    @Override
    double area() {
        return Math.PI * radius * radius;
    }
}

public class Rect extends Shape {
    double w, h;
    @Override
    double area() {
        return w * h;
    }
}

// آرایه چندریخت!
Shape[] shapes = { new Circle(), new Rect() };
for (Shape s : shapes) {
    System.out.println(s.area());   ← هر کدام متد خودش!
}

۲. Overloading (زمان کامپایل)

متدهای هم‌نام با پارامترهای متفاوت:

static void print(int x) {
    System.out.println("عدد: " + x);
}

static void print(String s) {
    System.out.println("رشته: " + s);
}

static void print(double d) {
    System.out.println("اعشاری: " + d);
}

print(5);       ← متد اول
print("سلام");   ← متد دوم
print(3.14);    ← متد سوم

مثال عملی: سیستم پرداخت

public abstract class Payment {
    abstract void pay(double amount);
}

public class CardPayment extends Payment {
    @Override
    void pay(double amount) {
        System.out.println("پرداخت " + amount + " با کارت");
    }
}

public class CashPayment extends Payment {
    @Override
    void pay(double amount) {
        System.out.println("پرداخت " + amount + " نقدی");
    }
}

مزایای چندریختی

چندریختی + وراثت + کپسوله‌سازی + انتزاع = چهار اصل OOP که جاوا بر آن‌ها بنا شده!

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

ابزارهای مرتبط