Загалом слово поліморфізм означає «багато форм» або здатність об'єкта змінювати форму.
Поліморфізм у термінах програмування означає, що метод із однією назвою може здійснювати безліч варіантів поведінки.
Розмова про численні поведінки може здатися надто абстрактною. Однак, що наприклад, можна сказати про термін відкрити.
Можна відкрити двері, коробку, вікно, рахунок у банку. Слово відкрити можна використовувати у різних життєвих ситуаціях.
Кожен об'єкт, з яким використовується це слово, надає йому особливого значення. Однак у всіх випадках для опису дії використовується одне й те саме слово – відкрити.
Об'єкти дочірнього класу можуть викликати методи батьківського класу. Вони їх успадковують. Але завдяки поліморфізму об'єкти батьківського класу можуть викликати методи своїх нащадків, які зазвичай і не створені в момент створення батьківського класу.
Метою поліморфізму є використання одного імені для завдання спільних для класу дій.
Тобто здатність одного й того програмного тексту x.M() виконуватися по-різному, залежно від того, до якого класу належить об'єкт x.
Поліморфізм гарантує, що метод M, що викликається, буде належати класу до якого належить об'єкт x.
Поліморфізм реалізується через віртуальні та абстрактні методи.
Поліморфізм — це здатність об’єктів з однаковим інтерфейсом вести себе по-різному залежно від конкретного типу. Він дозволяє використовувати один і той самий виклик методу для різних типів об’єктів.
virtual, override, інтерфейси.
Цей вид поліморфізму реалізується через ключові слова virtual та override.
using System;
class Animal
{
public virtual void Speak()
{
Console.WriteLine("Тварина видає звук");
}
}
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("Собака гавкає");
}
}
class Cat : Animal
{
public override void Speak()
{
Console.WriteLine("Кіт нявкає");
}
}
class Program
{
static void Main()
{
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.Speak(); // Собака гавкає
a2.Speak(); // Кіт нявкає
}
}
Перевантаження дозволяє створювати кілька методів з однаковою назвою, але різними параметрами.
using System;
class Calculator
{
public int Add(int a, int b) => a + b;
public double Add(double a, double b) => a + b;
public int Add(int a, int b, int c) => a + b + c;
}
class Program
{
static void Main()
{
Calculator calc = new Calculator();
Console.WriteLine(calc.Add(2, 3)); // 5
Console.WriteLine(calc.Add(2.5, 3.1)); // 5.6
Console.WriteLine(calc.Add(1, 2, 3)); // 6
}
}
Інтерфейси дозволяють реалізовувати поліморфізм, змушуючи різні класи мати однаковий набір методів.
using System;
interface IShape
{
double GetArea();
}
class Circle : IShape
{
public double Radius { get; }
public Circle(double radius) => Radius = radius;
public double GetArea() => Math.PI * Radius * Radius;
}
class Rectangle : IShape
{
public double Width { get; }
public double Height { get; }
public Rectangle(double w, double h) { Width = w; Height = h; }
public double GetArea() => Width * Height;
}
class Program
{
static void Main()
{
IShape shape1 = new Circle(5);
IShape shape2 = new Rectangle(4, 6);
Console.WriteLine($"Площа кола: {shape1.GetArea()}");
Console.WriteLine($"Площа прямокутника: {shape2.GetArea()}");
}
}