Polymorphism به معنای "شکل های متعدد" است و زمانی رخ می دهد که ما کلاس های زیادی داشته باشیم که از طریق وراثت به یکدیگر مرتبط هستند.
همانطور که در فصل قبل مشخص کردیم.
ارث به ما اجازه میدهد
فیلدها و متدها را از کلاس دیگری به ارث می برند. چند شکلی
از آن روش ها برای انجام وظایف مختلف استفاده می کند. این به ما امکان می دهد یک تک آهنگ را اجرا کنیم
به روش های مختلف عمل کنید.
به عنوان مثال، یک کلاس پایه به نام Animal را در نظر بگیرید که متدی به نام animalSound() دارد. طبقات مشتق شده از حیوانات می تواند خوک، گربه، سگ، پرنده باشد - و آنها همچنین اجرای خود را از صدای حیوانات دارند (خوک جوک می کند و گربه میو می کند و غیره):
class Animal // Base class (parent)
{
public void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal // Derived class (child)
{
public void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal // Derived class (child)
{
public void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}از فصل وراثت به خاطر داشته باشید که از نماد : برای ارث بردن از یک کلاس استفاده می کنیم. p>
اکنون میتوانیم Pig و ایجاد کنیم. را می بینید و روش
DoganimalSound() را روی هر دوی آنها فراخوانی کنید:
class Animal // Base class (parent)
{
public void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal // Derived class (child)
{
public void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal // Derived class (child)
{
public void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal(); // Create a Animal object
Animal myPig = new Pig(); // Create a Pig object
Animal myDog = new Dog(); // Create a Dog object
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}The output will be:
The animal makes a sound
The animal makes a sound
The animal makes a soundخروجی مثال بالا احتمالاً آن چیزی نبود که انتظار داشتید. دلیل آن این است که متد کلاس پایه، زمانی که نام یکسانی دارند، متد کلاس مشتق شده را لغو می کند.
با این حال، سی شارپ با افزودن کلمه کلیدی مجازی به متد داخل کلاس پایه و با استفاده از نسخ برای هر روش کلاس مشتق شده:
class Animal // Base class (parent)
{
public virtual void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal // Derived class (child)
{
public override void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal // Derived class (child)
{
public override void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal(); // Create a Animal object
Animal myPig = new Pig(); // Create a Pig object
Animal myDog = new Dog(); // Create a Dog object
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}The output will be:
The animal makes a sound
The pig says: wee wee
The dog says: bow wow- برای قابلیت استفاده مجدد کد مفید است: هنگام ایجاد یک کلاس جدید، از فیلدها و متدهای کلاس موجود استفاده مجدد کنید.