Привет, сегодня хочу поговорить про полиморфизм. Очень часто мне не хватает знаний по полиморфизму, я очень много уделил внимания этому вопросу , но до сих пор не уверен, что я до конца понимаю, что такое полиморфизм. Если вы знаете больше меня, обязательно напишите в комментариях в чём я ошибаюсь. Лично у меня нет уверенности, что я понимаю полиморфизм правильно.
Всё дело в том, что полиморфизм — это сложная концепция и несмотря на то, что она формулируется очень просто, полиморфизм — это единственная реализация, множественное проведения, нюансов и реализаций там тьма.
Полиморфизм, это не чисто объектно-ориентированная концепция она может использоваться в любом языке программирования и является самостоятельной и те, кто говорит, что это один из принципов ООП прав, а те, кто говорят, что это только ООП принцип не правы. Увы этот принцип может использоваться в любой парадигме.
Сложности начинаются уже с теории, во-первых, полиморфизм реализуются в каждом языке программирования по-своему, и программисты обычно говорят, что понимают полиморфизм с той реализации которая есть в их языке программирования. Но сами языки программирования бывает двух типов, первый эта параметрический полиморфизм, второй полиморфизм подтипов.
Параметрический полиморфизм
Параметрический полиморфизм говорит о том, что независимо от типа параметра функции, эта функция должна его обрабатывать корректно и выдавать корректные результаты, то есть множественное поведение независящие от типа параметра. Такой полиморфизм еще имеет отдельный вариант, который называется "Ad hoc" полиморфизм, который реализуется через перегрузку Функции. То есть, когда мы создаем несколько функций с одинаковым именем, но с разным набором параметров, то тогда мы создаем несколько вариантов реализации.
Кажется, что тут есть какое-то нарушение, потому что первоначальный тезис говорил о том, что единственная реализация, множественное поведение, а здесь несколько вариантов реализации. И вот тогда говорят, что здесь полиморфизм с позиции интерфейса. То есть у нас есть единый интерфейс, но в зависимости какие параметры мы передали, какого типа перегрузка позволяет нам скрыть, то, что у нас несколько реализаций и из позиции интерфейса у нас получается полиморфное поведение.
Иногда Ad hoc полиморфизм выносят и делают отдельным типом, а иногда его делают особым вариантом параметрического полиморфизма. В зависимости от того с каким языком мы имеем дело у нас параметрический полиморфизм может быть представлен как Ad hoc полиморфизмом, так и честным параметрическим полиморфизмом. Как видите все становится намного сложнее, когда начинаешь разбираться с этой концепцией.
Полиморфизм подтипов
Теперь относительно полиморфизма подтипов. Здесь тоже всё сложно часто говорят, что это реализуется путем наследования, хотя наследование это реализация, то есть у нас между потомками и родителям есть разница в реализации. Это делается с той позиции, что нам нужно реализовать разное поведение родительского и дочернего класса, а вот параметрический полиморфизм рассматривает именно иерархию типов, это вопрос с позиции классификации. У нас есть некий тип, у него есть подтипы даже если у них одинаковая реализация с позиции классификации они разные.
Идея параметрического полиморфизма, конечно, ложиться на идею наследование, потому что реализация может быть совмещена с иерархией классов. То есть мы можем с позиции классификации сделать точно такую же иерархию классов и сделать для них реализацию, здесь есть пересечение.
А вообще параметрический полиморфизм — это вопрос классификации, а не реализации. В параметрическом полиморфизме говориться о том, что мы должны иметь возможность обрабатывать единым образом всех потомков какого-то типа. Если у нас тип, который мы обрабатываем выдаём результат, то все подтипы этого типа должны обрабатываться тем же самым кодом, той же самой единственной реализацией. Такой полиморфизм тоже реализуется не во всех языках программирования где-то есть, где-то нет.
Итог
Таким образом даже рассмотрев вот эту верхушку айсберга, только определение, становится понятно, что полиморфизмов бывает много, они реализуются по-разному, они функционирует по-разному. Есть ещё особенности реализации в конкретном языке программирования, поэтому говорить, что полиморфизм это, что-то простое, неправильно, говорить, что это чисто объектно-ориентированная парадигма, или объектно-ориентированная концепция тоже неправильно.
Это концепция, которая очень сложна и очень большая и разбираться в ней можно бесконечно. Поэтому если у есть что-то добавить про полиморфизм, какие-то частные случаи, интересные случаи, обязательно напишите это в комментариях. Спасибо что читали. До свидания.