فهرست سرفصل‌های #C
خانه (HOME) مقدمه (Intro) شروع کار (Get Started) سینتکس (Syntax) خروجی (Output) کامنت ها (Comments) متغیرها (Variables) ثابت ها (Constants) نمایش متغیرها (Display Variables) متغیرهای متعدد (Multiple Variables) شناسه ها (Identifiers) انواع داده (Data Types) تبدیل نوع (Type Casting) ورودی کاربر (User Input) عملگرها (Operators) انتساب (Assignment) مقایسه (Comparison) منطقی (Logical) ریاضی (Math) رشته ها (Strings) اتصال رشته ها (Concatenation) درون گذاری رشته (Interpolation) دسترسی به رشته ها (Access Strings) کاراکترهای ویژه (Special Characters) بولی ها (Booleans) if (If...Else) else (If...Else) else if (If...Else) شکل کوتاه if..else (Short hand if..else) سوئیچ (Switch) حلقه while (While Loop) حلقه for (For Loop) حلقه foreach (Foreach loop) شکستن/ادامه (Break/Continue) آرایه ها (Arrays) حلقه روی آرایه (Loop through an array) مرتب سازی آرایه ها (Sort arrays) آرایه های چندبعدی (Multidimensional arrays) متدها (Methods) پارامترها (Parameters) پارامتر پیش فرض (Default Parameter) مقادیر بازگشتی (Return Values) آرگومان های نام دار (Named Arguments) بارگذاری متد (Method Overloading) شیء گرایی (OOP) کلاس ها/اشیا (Classes/Objects) چند شیء (Multiple Objects) اعضای کلاس (Class Members) سازنده ها (Constructors) قیدهای دسترسی (Access Modifiers) ویژگی ها (Properties) وراثت (Inheritance) چندریختی (Polymorphism) انتزاع (Abstraction) اینترفیس (Interface) چند اینترفیس (Multiple Interfaces) شمارش ها (Enums) فایل ها (Files) استثناها (Exceptions) افزودن دو عدد (Add Two Numbers) نمونه ها (Examples)
#C

#C — چندریختی (Polymorphism)

آخرین بروزرسانی: 1404/08/05

چندریختی (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 بنویس.
  • برای صرفه جویی در کد عالی است.
  • در بازی ها و اپ ها زیاد استفاده می شود.

برای ادامه، بخش کلاس های انتزاعی و وراثت را بخوان تا درک شی گرایی ات کامل تر شود.