Полиморфизм и его виды
Закрываю тему ООП самым сложным принципом. Если с абстракцией, инкапсуляцией и наследованием все относительно просто, то в силу развития самого ООП, о чем поведал в предыдущей заметке, есть подводные камни, как минимум из-за того, что он имеет несколько типов, о чем чуть дальше. Кроме того, на собеседованиях часто называют ошибочно ООП-полиморфизмом всего лишь один вид полиморфизма. Начать разбирать вопрос стоит с общего определения полиморфизма и мне нравится трактовка Сергея Немчинского:
Полиморфизм - способность функции работать с данными разных типов
Коротко и ясно. А теперь подробнее о более глубокой стороне вопроса и непосредственно видах полиморфизма.
1. Ad-hoc-полиморфизм
Ad-hoc-полиморфизм - вид полиморфизма при котором в зависимости от типа данных применяются различные функции. В строго типизированных языках инструментом реализации такого полиморфизма является перегрузка методов. В слабо типизированных языках посредством привидения типов.
Ad-hoc полиморфизм на примере Java(перегрузка методов):
public class Program { static int sum(int x, int y){ return x + y; } static double sum(double x, double y){ return x + y; } static int sum(int x, int y, int z){ return x + y + z; } }
Ad-hoc полиморфизм на примере JavaScript (приведение типов):
alert( String(null) === "null" ); // true alert( true + "test" ); // "truetest" alert( "123" + undefined ); // "123undefined"
2. Параметрический полиморфизм
Параметрический полиморфизм - вид полиморфизма, когда функция выполняется вне зависимости от типа аргумента. Такой вид полиморфизма в языках часто раскрывается через Generic'и. Ярким примером является вызов статической функции sort() класса Collections в Java:
public static <T extends Comparable<? super T>> void sort(List<T> list)
3. Полиморфизм подтипов
Полиморфизм подтипов - свойство системы, позволяющее использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. На мой взгляд в данном определении слово интерфейс фигурирует не в значении интерфейсов из языков программирования, где определяются функции, которые мы должны реализовать, а в значении контракта. А уже под контрактом у нас может иметься ввиду - как интерфейс, что мы знаем по языкам программирования, так и абстрактный класс.