polymorphism

Поліморфізм у програмуванні

Hello, World, друзі. Поліморфізм – концепція в програмуванні та теорії типів, відповідно до якої використовується спільний інтерфейс для обробки різних спеціалізованих типів.

Зрозуміле формулювання. Чи не так? Насправді дуже часто мені, як і більшості програмістів, не вистачає знань про поліморфізм. Ба, більше, я досі не певен, що до кінця розумію, що таке поліморфізм і не маю впевненості, що я правильно його розумію.

Справа в тому, що поліморфізм – це складна концепція. І, не дивлячись на те, що визначення поліморфізму дуже просте, це не чисто об’єктно-орієнтована концепція. Вона може використовуватись у будь якій мові програмування і є самостійною.

Ті, хто стверджують, що це один з принципів ООП – правий, а ті хто, стверджують, що це виключно ООП-шний принцип – неправі. Даний принцип може використовуватись у будь якій парадигмі.

Складнощі починаються вже з теорії.

По-перше, поліморфізм реалізується у кожній мові програмування по-своєму і програмісти зазвичай кажуть, що розуміють поліморфізм з позиції реалізації в мові програмування, з якою вони працюють.

Типи поліморфізмів

Самі поліморфізми бувають двох типів:

  • параметричний поліморфізм;
  • поліморфізм підтипів.

Параметричний поліморфізм

Перший тип поліморфізму (параметричний) говорить про те, що незалежно від типу параметра функції ця функція повинна обробляти його коректно і повертати коректний результат. Тобто множинна поведінка не залежить від типу параметра. 

Такий поліморфізм має окремий варіант, який називається Ad hoc поліморфізм, який реалізується через перевантаження функції. Тобто, коли ми створюємо кілька функцій з однаковим іменем, але з різним набором параметрів. Таким чином ми створюємо кілька варіантів реалізації.

Здавалося б, це є порушення, бо початкова теза говорить про те, що єдина реалізація – множинна поведінка, а тут кілька варіантів реалізації. 

В таких випадках кажуть, що поліморфізм з позиції інтерфейсу. Тобто у нас є єдиний інтерфейс, але в залежності від того, які типу параметри ми передаємо, перевантаження дозволяє нам приховати, що ми маємо декілька реалізацій і з позиції інтерфейсу у нас виходить поліморфна поведінка.

Іноді Ad hoc поліморфізм виносять і роблять окремий тип, а іноді так і роблять окремим варіантом параметричного поліморфізму. І в залежності від того, з якою мовою програмування ми маємо справу, у нас параметричний поліморфізм може бути представлений як Ad hoc поліморфізмом, так і чесним параметричним поліморфізмом. 

Як бачите, все стає набагато складнішим, коли починаєш розбиратись з цією концепцією.

Поліморфізм підтипів

Тепер стосовно поліморфізму підтипів. Тут також все складно. 

Часто кажуть, що це реалізується шляхом наслідування, хоча наслідування є реалізацією. Тобто у нас між потомком та батьком є різниця в реалізації.

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

Це питання з позиції класифікації. У нас є певний тип, у нього є підтипи. Навіть якщо у них однакова реалізація, з точки зору класифікації вони різні.

Ідея параметричного поліморфізму звичайно лягає на ідею наслідування тому, що реалізація може бути суміщена з ієрархією класів. Тобто ми можемо з позиції класифікації створити точно таку ж ієрархію класів і зробити для них реалізацію.

Проте, в цілому параметричний поліморфізм це питання класифікації, а не реалізації і в параметричному поліморфізмі говориться про те, що ми маємо мати можливість обробляти єдиним шляхом усіх потомків певного типу.

Себто, якщо у нас тип, котрий ми обробляємо і видаємо результат, то всі підтипи даного класу повинні оброблятись таким же способом, таким же кодом, такою ж реалізацією, як і батьківський тип. Такий поліморфізм реалізується не у всіх мовах програмування. Десь він є, десь його немає. 

Таким чином, навіть розглянувши цю вершину айсберга на чисто понятійному рівні, стає зрозуміло, що може бути багато різних поліморфізмів, а реалізуються вони різними способами і функціонують вони по-різному. Також є особливості реалізація в певній конкретній мові програмування.

Тому говорити, що поліморфізм – це просто, не є правильним.

Говорити, що поліморфізм – це чисто об’єктно-орієнтована парадигма або об’єктно-орієнтована концепція, теж є правильним.

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

На цьому у мене все. До нових зустрічей.

Залишити відповідь