چندریختی (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 که جاوا بر آنها بنا شده!
این مبحث بخشی از دوره آموزش کامل جاوا است.