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();
}
}
Виведення буде:
Тварина видає звук
Свиня каже: хрю хрю
Собака каже: гав гав
Навіщо і коли використовувати «Наслідування» та «Поліморфізм»?
Це корисно для повторного використання коду: повторно використовуйте поля та методи існуючого класу під час створення нового класу.