У загальному випадку слово поліморфізм означає «багато форм» або здатність об'єкта змінювати форму.
Поліморфізм в термінах програмування означає, що метод з однією назвою може здійснювати безліч варіантів поведінки
Розмова про численні поведінки може здатися занадто абстрактним. Однак, що, наприклад, можна сказати про термін відкрити.
Можна відкрити двері, коробку, вікно, рахунок у банку. Слово відкрити можна використовувати в різних життєвих ситуаціях.
Кожний об'єкт, з яким використовується це слово, надає йому особливе значення. Однак у всіх випадках для опису дії використовується те саме слово – відкрити.
Об'єкти дочірнього класу можуть викликати методи батьківського класу. Вони їх успадковують.
Але завдяки поліморфізму об'єкти батьківського класу можуть викликати методи своїх потомків, які звичайно не створені в момент створення батьківського класу.
Метою поліморфізму є використання одного імені для завдання загальних для класу дій.
Тобто здатність того самого програмного тексту x.M() виконуватися по-різному, залежно від того, з яким об'єктом зв'язана сутність x.
Поліморфізм гарантує, що викликуваний метод M буде належати класу об'єкта, пов'язаному з сутністю x.
Поліморфізм реалізується через віртуальні і абстрактні методи.
Ми створювали клас Triangle, що описує трикутник по трьом його сторонам. Цей клас буде батьківським.
У цьому класі був метод Perimeter, що обчислює периметр і метод Print, що виводить значення полів на екран.
Можна створити дочірній клас Equilateral, що описує рівносторонній трикутник по його одній стороні.
Об'єкти цього класу успадкують ці методи і можуть їх використовувати:
Зв'язування – передача адреси методу при його виклику (у те місце, звідки викликається метод).
При виклику методу по його імені повинне викликатися його тіло. Програмісти називають цей процес зв'язуванням.
Зв'язування, тобто передача адреси, відбувається:
Зв'язування під час компіляції називається раннім зв'язуванням і використовується, якщо адреса методу відома на момент компіляції додатка.
Раннє зв'язування використовується для виклику звичайних методів. При виконанні програми не відбувається втрати часу, так як зв'язування завершується при створенні виконуваного коду програми
Це дає перевагу в порівнянні з пізнім зв'язуванням.
Зв'язування під час виконання називається пізнім зв'язуванням або динамічним зв'язуванням і використовується, якщо адреса методу не відома під час компіляції і стає відомим тільки під час виконання програми.
Пізніше зв'язування реалізується за допомогою віртуальних методів.
У випадку віртуального методу комп'ютер «обманюється» визначенням методу, але насправді метод на той момент не визначений. Віртуальний метод виступає як «заповнювач» реального методу.
Реальний метод визначається під час виконання програми.
Створимо клас Shape, що описує плоскі фігури. Цей клас буде батьківським.
В цьому класі буде Point-центр фігури. Метод moveTo (Point point), що переміщає центр фігури в іншу точку, і повертає довжину переміщення. Віртуальний метод Area (), що обчислює площу, який буде перевизначатися вдочерніх класах. Метод Border (), що обчислює кордон фігури, який буде ховатися методом дочірнього класу і позначатися new.
Якщо вам потрібно, щоб похідний член мав таке ж ім'я, як і член в базовому класі, але ви не хочете, щоб він брав участь у віртуальному виклику, використовуйте нове ключове слово new.
Ключове слово new вставляється перед типом значення, що повертається заміщає члена класу.
Створено два дочірніх класи Circle і Square, що описують коло (розміщений радіус) і квадрат (додана сторона).
Об'єкти цього класу успадкують метод moveto (раннє зв'язування) і можуть їх використовувати, метод Area() і Border()( пізніше зв'язування):
Об'єкти дочірнього класу можуть викликати методи батьківського класу. Вони їх успадковують.
Завдяки поліморфізму об'єкти батьківського класу можуть викликати методи своїх потомків, які звичайно не створені в момент створення батьківського класу.
Поліморфізм гарантує, що викликуваний метод буде належати класу об'єкта, пов'язаному з потрібною сутністю.