پلیمورفیسم (Polymorphism) یکی از مفاهیم کلیدی در برنامهنویسی شیگرا است که به این معنی است که یک شی میتواند به شیوههای مختلفی رفتار کند. در دارت، پلیمورفیسم معمولاً از طریق وراثت و متدهای override یا استفاده از اینترفیسها (Interfaces) پیادهسازی میشود.
در دارت، پلیمورفیسم به دو نوع اصلی تقسیم میشود:
1. پلیمورفیسم در زمان اجرا (Runtime Polymorphism)
این نوع پلیمورفیسم هنگامی رخ میدهد که یک شی از کلاسهای مختلف با استفاده از ارثبری یا پیادهسازی اینترفیسها، رفتارهای مختلفی را از خود نشان دهد.
2. پلیمورفیسم در زمان کامپایل (Compile-time Polymorphism)
این نوع پلیمورفیسم مربوط به ارثبری و اورراید کردن متدها است، یعنی در زمان کامپایل مشخص میشود که کدام متد فراخوانی خواهد شد.
مثال از پلیمورفیسم در دارت
در اینجا یک مثال ساده از پلیمورفیسم با استفاده از وراثت و متدهای override
در دارت آورده شده است:
// تعریف یک کلاس پایه (Parent class)
class Animal {
void speak() {
print("Animal makes a sound");
}
}
// تعریف کلاس Dog که از Animal ارث میبرد
class Dog extends Animal {
@override
void speak() {
print("Dog barks");
}
}
// تعریف کلاس Cat که از Animal ارث میبرد
class Cat extends Animal {
@override
void speak() {
print("Cat meows");
}
}
void main() {
// ایجاد یک لیست از اشیای مختلف
List<Animal> animals = [Dog(), Cat()];
// استفاده از پلیمورفیسم
for (var animal in animals) {
animal.speak(); // به طور خودکار متد مناسب برای هر شی فراخوانی میشود
}
}
توضیح مثال:
- در این مثال،
Dog
وCat
از کلاسAnimal
ارثبری میکنند و هرکدام متدspeak
خود را اورراید میکنند. - در داخل متد
main
، لیستی از اشیایAnimal
ساخته شده است، اما شامل اشیایDog
وCat
است. - وقتی حلقه
for
برای فراخوانی متدspeak
روی هر عنصر اجرا میشود، متد مناسب برای هر شی فراخوانی میشود. این رفتار در واقع پلیمورفیسم است، زیرا کد به طور صحیح به نوع واقعی شی در زمان اجرا واکنش نشان میدهد.
نتیجه:
پلیمورفیسم به شما این امکان را میدهد که با استفاده از یک رابط مشترک (مثل Animal
در این مثال)، کدهای انعطافپذیرتر و قابل گسترشتری بنویسید. هرکدام از کلاسهای فرزند میتوانند رفتار خود را در زمان اجرا نشان دهند، بدون اینکه نیاز به تغییر کد اصلی باشد.