НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ
Мова програмування C#. Уроки W3Schools українською для початківців

En Es De

C# Поліморфізм


Поліморфізм і перевизначення методів

Поліморфізм означає «багато форм», і він виникає, коли ми маємо багато класів, пов’язаних один з одним шляхом успадкування.

Як ми вказали в попередньому розділі, Наслідування дозволяє нам успадковувати поля та методи з іншого класу. Поліморфізм використовує ці методи для виконання різних завдань. Це дозволяє нам виконувати одну дію різними способами.

Наприклад, подумайте про базовий клас під назвою Animal, який має метод під назвою animalSound(). Похідними класами тварин можуть бути свині, коти, собаки, птахи — і вони також мають власну реалізацію звуку тварин (свиня хрює, а кіт нявкає тощо):

Приклад

class Animal  // Базовий клас (батьківський)
{
  public void animalSound()
  {
    Console.WriteLine("Тварина видає звук");
  }
}

class Pig : Animal  // Похідний клас (дочірній)
{
  public void animalSound()
  {
    Console.WriteLine("Свиня каже: хрю хрю");
  }
}

class Dog : Animal  // Похідний клас (дочірній)
{
  public void animalSound()
  {
    Console.WriteLine("Собака каже: гав гав");
  }
}

Пам’ятайте з розділу C# Спадкування, що ми використовуємо символ двокрапки : для успадкування від класу.

Тепер ми можемо створити об’єкти Pig та Dog і викликати animalSound() для обох з них:

Приклад

class Animal  // Базовий клас (батьківський)
{
  public void animalSound()
  {
    Console.WriteLine("Тварина видає звук");
  }
}

class Pig : Animal  // Похідний клас (дочірній)
{
  public void animalSound()
  {
    Console.WriteLine("Свиня каже: хрю хрю");
  }
}

class Dog : Animal  // Похідний клас (дочірній)
{
  public void animalSound()
  {
    Console.WriteLine("Собака каже: гав гав");
  }
}

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();
  }
}

Виведення буде:

Тварина видає звук
Тварина видає звук
Тварина видає звук

Спробуйте самі »


Не той результат, який я шукав

Вихід із наведеного вище прикладу, ймовірно, не такий, як ви очікували. Це тому, що метод базового класу перевизначає метод похідного класу, коли вони мають однакові назви.

Однак C# надає можливість перевизначити метод базового класу, додавши ключове слово virtual до методу всередині базового класу та використовуючи ключове слово override для кожного методу похідного класу:

Приклад

class Animal  // Базовий клас (батьківський)
{
  public virtual void animalSound()
  {
    Console.WriteLine("Тварина видає звук");
  }
}

class Pig : Animal  // Похідний клас (дочірній)
{
  public override void animalSound()
  {
    Console.WriteLine("Свиня каже: хрю хрю");
  }
}

class Dog : Animal  // Похідний клас (дочірній)
{
  public override void animalSound()
  {
    Console.WriteLine("Собака каже: гав гав");
  }
}

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();
  }
}

Виведення буде:

Тварина видає звук
Свиня каже: хрю хрю
Собака каже: гав гав

Спробуйте самі »

Навіщо і коли використовувати «Наслідування» та «Поліморфізм»?

Це корисно для повторного використання коду: повторно використовуйте поля та методи існуючого класу під час створення нового класу.