Noobo Droid
Noobo Droid
Пародист android-разработчика. Пишу в тви плоские шутки, а сюда - заметки. Чего не знаю - того не знаю, а не знаю я практически ничего!
Читать 1 минуту

Полиморфизм и его виды

Image for post

Закрываю тему ООП самым сложным принципом. Если с абстракцией, инкапсуляцией и наследованием все относительно просто, то в силу развития самого ООП, о чем поведал в предыдущей заметке, есть подводные камни, как минимум из-за того, что он имеет несколько типов, о чем чуть дальше. Кроме того, на собеседованиях часто называют ошибочно ООП-полиморфизмом всего лишь один вид полиморфизма. Начать разбирать вопрос стоит с общего определения полиморфизма и мне нравится трактовка Сергея Немчинского:

Полиморфизм - способность функции работать с данными разных типов

Коротко и ясно. А теперь подробнее о более глубокой стороне вопроса и непосредственно видах полиморфизма.

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. Полиморфизм подтипов

Полиморфизм подтипов - свойство системы, позволяющее использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. На мой взгляд в данном определении слово интерфейс фигурирует не в значении интерфейсов из языков программирования, где определяются функции, которые мы должны реализовать, а в значении контракта. А уже под контрактом у нас может иметься ввиду - как интерфейс, что мы знаем по языкам программирования, так и абстрактный класс.

7 просмотров
Добавить
Еще
Noobo Droid
Пародист android-разработчика. Пишу в тви плоские шутки, а сюда - заметки. Чего не знаю - того не знаю, а не знаю я практически ничего!
Подписаться