چندریختی (Polymorphism)
چندریختی یعنی «چند شکل داشتن». در برنامه نویسی یعنی یک متد در کلاس های مختلف، رفتار متفاوتی داشته باشد. مثل وقتی که دکمه «بازی کن» در موبایل، در بازی های مختلف کارهای متفاوتی می کند!
ارتباط وراثت و چندریختی
چندریختی زمانی اتفاق می افتد که چند کلاس با وراثت به هم مرتبط باشند. مثلاً کلاس پایه Animal متدی به نام animalSound() دارد و هر کلاس فرزند صدای مخصوص خودش را تعریف می کند.
class Animal // کلاس پایه (پدر)
{
public void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal // کلاس فرزند
{
public void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal // کلاس فرزند
{
public void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
نکته: اینجا هر حیوان متد خودش را دارد، اما چون از Animal ارث بری کرده اند، می توانیم همه را با نوع Animal بسازیم.
مشکل بدون کلیدواژه virtual و override
اگر در کلاس پدر از virtual استفاده نکنیم، متدهای فرزندها جایگزین نمی شوند. یعنی همه خروجی یکسان می گیرند!
class Animal
{
public void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal
{
public void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal
{
public void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal();
Animal myPig = new Pig();
Animal myDog = new Dog();
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}
هشدار: خروجی همه یکی است چون virtual و override استفاده نشده.
استفاده درست از virtual و override
برای فعال شدن چندریختی واقعی، باید در کلاس پایه جلوی متد virtual بنویسی و در کلاس های فرزند override.
class Animal
{
public virtual void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal
{
public override void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal
{
public override void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal();
Animal myPig = new Pig();
Animal myDog = new Dog();
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}
حالا هر حیوان صدای مخصوص خودش را دارد. این یعنی چندریختی واقعی!
جمع بندی سریع
- چندریختی یعنی یک متد، چند رفتار مختلف.
- در کلاس پایه از
virtualاستفاده کن. - در کلاس فرزند
overrideبنویس. - برای صرفه جویی در کد عالی است.
- در بازی ها و اپ ها زیاد استفاده می شود.
برای ادامه، بخش کلاس های انتزاعی و وراثت را بخوان تا درک شی گرایی ات کامل تر شود.