C# – چندریختی (Polymorphism)
ندریختی به معنای “اشکال مختلف” است و در برنامهنویسی شیءگرا زمانی اتفاق میافتد که کلاسهای مختلفی از نظر وراثت با یکدیگر مرتبط هستند و از متدها برای انجام وظایف مختلف استفاده میشود. این مفهوم به ما این امکان را میدهد که یک عمل را به روشهای مختلف انجام دهیم.
مفهوم چندریختی و بازنویسی متدها (Method Overriding)
چندریختی به ما این امکان را میدهد که یک متد را در کلاسهای مختلف به شیوههای متفاوت پیادهسازی کنیم. این کار با استفاده از وراثت و بازنویسی متدها انجام میشود. برای اینکه یک متد در کلاس پایه قابل بازنویسی باشد، باید از کلیدواژه virtual
استفاده کنیم و در کلاسهای مشتق شده از کلیدواژه override
استفاده کنیم.
مثال ابتدایی از چندریختی
در این مثال، کلاس پایه Animal
متدی به نام animalSound()
دارد و کلاسهای مشتق شده مانند Pig
و Dog
متدهای خود را برای تولید صداهای خاص پیادهسازی میکنند.
بدون استفاده از virtual
و override
using System;
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
Animal myPig = new Pig(); // ایجاد شیء از Pig
Animal myDog = new Dog(); // ایجاد شیء از Dog
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}
خروجی:
The animal makes a sound
The animal makes a sound
The animal makes a sound
در این حالت، حتی وقتی از اشیاء کلاسهای مشتق شده استفاده میکنیم، متد animalSound
از کلاس پایه فراخوانی میشود. این به دلیل عدم استفاده از virtual
و override
است.
استفاده از virtual و override
برای اینکه متدها به درستی در کلاسهای مشتق شده بازنویسی شوند، باید از کلیدواژه virtual
در کلاس پایه و از override
در کلاسهای مشتق شده استفاده کنیم.
با استفاده از virtual
و override
using System;
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
Animal myPig = new Pig(); // ایجاد شیء از Pig
Animal myDog = new Dog(); // ایجاد شیء از Dog
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}
خروجی:
The animal makes a sound
The pig says: wee wee
The dog says: bow wow
در این حالت، با استفاده از virtual
و override
، متد animalSound
به درستی در کلاسهای مشتق شده بازنویسی شده و نتیجه مورد انتظار به دست میآید.
چرا و چه زمانی از "وراثت" و "چندریختی" استفاده کنیم؟
-
قابلیت استفاده مجدد از کد: این ویژگی به شما این امکان را میدهد که متدها و ویژگیهای مشترک را در کلاسهای پایه تعریف کرده و در کلاسهای مشتق شده از آنها استفاده کنید. این کار باعث میشود که کد شما تمیزتر و قابل نگهداریتر باشد.
-
انعطافپذیری: چندریختی به شما این امکان را میدهد که متدها را در کلاسهای مختلف به روشهای متفاوت پیادهسازی کنید و به این ترتیب کد شما قابل گسترشتر و انعطافپذیرتر خواهد بود.
-
مدیریت سادهتر تغییرات: با استفاده از چندریختی، میتوانید تغییرات را در یک مکان (در کلاس پایه) اعمال کرده و این تغییرات به تمام کلاسهای مشتق شده اعمال خواهد شد.
این ویژگیها باعث میشوند که برنامهنویسی شیءگرا به یک ابزار قدرتمند برای ایجاد نرمافزارهای مقیاسپذیر و قابل نگهداری تبدیل شود.
برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید. صفحه ورود و ثبت نام