چند شکلی و روشهای غلبه بر(Polymorphism and Overriding Methods)


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 و ایجاد کنیم.
Dog
را می بینید و روش 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");
  }
}

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









چرا و چه زمانی از "وارث" و "چند شکلی" استفاده کنیم؟


- برای قابلیت استفاده مجدد کد مفید است: هنگام ایجاد یک کلاس جدید، از فیلدها و متدهای کلاس موجود استفاده مجدد کنید.